1

Тема: Функція gets()

Чому не вжається використовувати функцію gets() кілька разів у коді. Спочатку я використав дану функцію, наступний код зробив роботу і вивів текст через puts() і потім не виходячи з консолі хочу знову ввести новий текст (з допомогою gets() ). Як це зробити???

2 Востаннє редагувалося wander (01.05.2019 19:46:33)

Re: Функція gets()

Я доволі погано орієнтуюсь у Сішних функціях, але, якщо пам'ять не підводить,
то
gets() - закінчує введення при зустрічі символу введення нового рядка
або EOF, а пробіл розглядає як частину вхідного рядка.
А от наприклад
scanf() - закінчує ввід враховуючи і пробіл, і новий рядок і EOF.

kotandrey написав:

Спочатку я використав дану функцію, наступний код зробив роботу і вивів текст через puts() і потім не виходячи з консолі хочу знову ввести новий текст (з допомогою gets() ). Як це зробити???

Ну, ще раз після puts, запросити ввід через gets не пробували?

3 Востаннє редагувалося wander (01.05.2019 19:56:21)

Re: Функція gets()

kotandrey написав:

Чому не вжається використовувати функцію gets() кілька разів у коді.

Ага, ну що ж, після деякого пошуку в інтернеті, вдалося з'ясувати, що gets()
більше не є частиною стандартного Сі і був випілений з мови (здається у С11, поправте
хто знає точно) оскільки gets() - не надавав захисту від переповнення буфера.
Стандарт C11 K.3.5.4.1 дає рекомендацію використовувати fgets() замість
gets().

C11 K.3.5.4.1 написав:

Recommended practice

The fgets function allows properly-written programs to safely process input lines too long to store in the result array. In general this requires that callers of fgets pay attention to the presence or absence of a new-line character in the result array. Consider using fgets (along with any needed processing based on new-line characters) instead of gets_s.

Подякували: Не Зелений1

4

Re: Функція gets()

Так, пробував. Чомусь коли вдруге використовую gets() у мене одразу завершується програма в тому місці коли код доходить до цього другого gets()

5

Re: Функція gets()

Я теж попробував, в мене все ок.  Можете дати код?

6 Востаннє редагувалося wander (01.05.2019 20:08:19)

Re: Функція gets()

kotandrey написав:

у мене

У вас це у вас, а у нас все добре. Звідки нам знати, що не так у вас.
Покажіть мінімальний уривок коду, який компілюється і демонструє вашу
проблему?

P. S. Але можливо у вас у вхідному потоці вводу, залишається лишній символ
"\n", то вам варто очисти input stream, скориставшись ф-ю fflush,
наприклад.

7

Re: Функція gets()

:
char S[2000];

int i,n,k,j;

cout<<"Введіть текст: ";
gets(S);
n=strlen(S);

cout<<endl;
cout<<"Введіть ключ: "<<endl;
cin>>k;

for(i=0;i<n;i++){
    if(S[i]!=' '){
for(j=0;j<k;j++){
S[i]+=1;
if(S[i]==123){
    S[i]=97;
   }
  }
 }
}

cout<<"Зашифрований текст: "<<endl;
puts(S); 


char S1[2000];
cout<<"Введіть текст: "<<endl;
gets(S1);

n=strlen(S1);

cout<<endl;

for(i=0;i<n;i++){
    if(S1[i]!=' '){
for(j=0;j<k;j++){
S1[i]-=1;
if(S1[i]==96){
    S1[i]=122;
   }
  }
 }
}


cout<<"Розшифрований текст "<<endl;
puts(S1);

8

Re: Функція gets()

Це проста задача з шифрування,  в ній gets(S1) чомусь не працює

9 Востаннє редагувалося wander (02.05.2019 11:52:56)

Re: Функція gets()

kotandrey, господи, код просто жахливий, як ви самі в ньому орієнтуєтесь?
Ви хоча б читали, що я вам писав?

adziri написав:

Покажіть мінімальний уривок коду, який компілюється і демонструє вашу
проблему

Більше того, Ви просто взяли і видерли частину коду з вашої програми, таким чином,
що нікому не вдалось би її запустити.
Якщо Ви хочете, щоб вам могли швидко допомогти, постарайтеся повно описати вашу
проблему, дати необхідні частини коду, дані які вводите, компілятор, ОС і т.д. Це
значно б спростило роботу нам, бо не прийшлося би витягувати з вас інформацію.
Бажано б вам ознайомитися з http://xyproblem.info/

kotandrey написав:

Це проста задача з шифрування, в ній gets(S1) чомусь не працює

Що означає не працює? Чомусь?
Ехх, гаразд.

1. Ніколи не змішуйте Сі та С++ - це різні мови, як банально б це не звучало. Чому ви
використовуєте то std::cin/std::cout, то pust/gets, яка причина переходу?
В С++ є свої аналоги, з ними і працюйте. Більше того gets з С++ був видалений
в С++14, а ви його використовуєте, ще й звичайну версію, а не gets_s чи fgets,
звідси можна зробити висновок, що у вас не КаЕль або він дуже старий :)
2.

char S[2000];
int i,n,k,j;
...
char S1[2000];

Ефективне використання пам'яті? Ні, не чув :D
Назви змінних, звісно говорять самі за себе, як ви в них орієнтуєтесь?
3.

cout<<"Введіть ключ: "<<endl;
cin>>k;

От мене, як користувача просять ввести ключ, що роблю я, беру та вводжу
якесь число наприклад 25, а також після цього натискаю ентер, для завершення
вводу. В потік попадає значення 25<enter>, ми за допомогою cin>>k
зчитуємо з потоку лише число, а <enter> залишається у потоці висіти.
Згодом Ви, пане, намагаєтесь зчитати щось з потоку, проте там першим буде <enter>,
якщо ви читали мій перший пост, то знаєте, що gets зустрівши <enter>
завершує ввід, так і нічого не зчитавши з потоку і ваша програма закривається.
Також, якщо б Ви прочитали мій попередній пост, то побачили б, що я це передбачав:

adziri написав:

P. S. Але можливо у вас у вхідному потоці вводу, залишається лишній символ
"\n", то вам варто очисти input stream, скориставшись ф-ю fflush,
наприклад.

Проте, я ж незнав, що ви пишете в С++, тому краще замість fflush скористатися
std::cin.clear, та повикидувати всі pust/gets і замінити на std::cin/std::cout.

Проте, звісно я ж незнаю чи це єдина проблема вашого коду, бо цілого я не бачив,
надіюся там ніде в циклах немає UB :)

Подякували: leofun011

10

Re: Функція gets()

Виліт тому що більше 2000 не можна, зробіть

char S[1000];
char S1[1000];

і вильоту не буде.
і можна замість того набрати

char *S=new char[1024*64];//64kb
char *S1=new char[1024*768];

просто масив без виділеної пам'яті вилітає, якщо більше 2000 а також коли не написати new char

11 Востаннє редагувалося wander (02.05.2019 11:26:13)

Re: Функція gets()

Не Зелений, що за маячня?

Подякували: leofun011

12

Re: Функція gets()

Маячня)))))  :D
що ж зробиш, забув.
не 2000, а 1024*1024*2, тобто 2 мегабайти, більше 2 не можна без виділення, а в 64-бітних системах по-моєму 4 мегабайти.

int main(){int size=1024*1024*5; char array[size]; return 0;}

ось це спробуйте 100% і на 64-бітній і на 32-бітній - виліт, сам тільки що перевірив

13

Re: Функція gets()

Не Зелений, більшої маячні я просто не чув, крім того, таке враження, що
у вас деструтнивний розлад, бо пишите в подімленні ви одне, а в коді зовсім інше
тай нормально двох слів зв'язати не можете (без образ). Може спочатку свої думки
впорядкуєте, а потім радити будете щось, але перед тим ще разок добре подумайте
чи те, що ви хочете написати не маячня? Книжки там почитайте по Архітектурі
комп'ютера, кажуть допомагає :)

Подякували: leofun011

14

Re: Функція gets()

По-моєму це у вас тут у всіх якісь розлади точно є. Зокрема, інтелекту (розумова відсталість).
Я нормально все пояснив, що маячня те що я написав до цього, бо я забув, а тепер згадав, що не 2000 байт, а 2048 кб, тобто 2 мегабайти, а на 64-бітних системах - 4 мегабайти. щоб не ьуло сумніву я надав код, який після компіляції і запуску видає помилку про виліт програми. 5 мегабайтів - це більше, ніж 4, не писати ж мені

int main(){int size=1024*1024*4+1; char array[size]; return 0;}

написав доступно, 5 мегабайтів вже бути не може.
знайшов інформацію, розмір стеку не дозволяє зберігати великі масиви, тому вони мають бути поміщені в оперативну пам'ять (озу), для цього потрібен вказівник, який вказує на місце зберігання масиву в озу.
ось читайте
Посилання видалені модератором.


і знову виявилось, що маячня. але ж не така повна, як ви написали!
короче виявилось що оцей самий розмір стеку можна настроювати в операційній системі та в середовищі розробки.
я не можу визнати що це є маячня, оскільки в мене вже не перший раз вилітає програма без виділеної пам'яті
існує поняття, максимальний розмір масиву с++, за цим йдіть в гугл (або в *****)

15

Re: Функція gets()

Не Зелений, та ви лайножер з досвідом, я бачу

Подякували: wander1

16 Востаннє редагувалося Fox (02.05.2019 16:26:57)

Re: Функція gets()

FakiNyan написав:

Не Зелений, та ви лайножер з досвідом, я бачу

Якщо бачите російський форум по програмуванню, то туди краще не заходити.
І справа не так в мові, як в тому, що вони ніфіга не знають, а як знають, то розкажуть тільки за гроші.
В мене колись було питання і я задав його на en stack overflow і суберфорумі.
На stack overflow зробили майже за мене хоча я навіть не просив, а на суберфорумі почали таку дичину нести в тему.
ПС: Можливо мені просто здалося, але на суберфорумі одні студенти з одним питанням по стандартній формі:
"Дано матрицю, переставити крайні верхні елементи місцями.
А ну швидко мені зробили!!!!!!!!"

Подякували: wander, FakiNyan2

17

Re: Функція gets()

на стековерфлоу є ті, хто женеться за репутацією, і я ще чув, що потім свої акаунти мона показувати роботодавцю, аби вони бачили, який ти крутий і вумний чувак

Подякували: Fox1

18 Востаннє редагувалося Fox (02.05.2019 16:34:57)

Re: Функція gets()

FakiNyan написав:

на стековерфлоу є ті, хто женеться за репутацією, і я ще чув, що потім свої акаунти мона показувати роботодавцю, аби вони бачили, який ти крутий і вумний чувак

Прихований текст

А що можна зробити з акаунтом суберфоруму ? xD

19

Re: Функція gets()

Я відійшов від теми в намаганні доказати свою правоту, винен.
А все ж цікаво, чому в ТС той код не працює? Може в нього в середовищі розмір стеку кілобайт поставлено? Чи є інша причина (іншої передбачити не можу)?
А на рахунок кіберфоруму, вони роздають мейли mail@cyberforum.ru, кращим користувачам форуму які пробули довше 3 років, ріплейс же не роздає. така адреса надається всім модераторам при їх призначенні. от добре було б мати адресу mail@replace.org.ua.

20

Re: Функція gets()

Не Зелений написав:

Я відійшов від теми в намаганні доказати свою правоту, винен.
А все ж цікаво, чому в ТС той код не працює? Може в нього в середовищі розмір стеку кілобайт поставлено? Чи є інша причина (іншої передбачити не можу)?
А на рахунок кіберфоруму, вони роздають мейли mail@cyberforum.ru, кращим користувачам форуму які пробули довше 3 років, ріплейс же не роздає. така адреса надається всім модераторам при їх призначенні. от добре було б мати адресу mail@replace.org.ua.

Господи, я дав відповідь в повідомленні 9 розміром в довжину монітору,
що вам там не зрозуміло?