Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Проблем с функция gets() в C

Featured Replies

Здравейте, в момента съм решил да си направя един шифратор/дешифратор на текст, т.е  потребителят въвежда текст от клавиатурата, програмата преобразява символите и извежда в конзолата кодираният текст, по аналогичен алгоритъм с дешифратор се дешифрова изменения текст и се вижда оригиналния.

 

Идеята ми е следната:  

#include <stdio.h>#include <stdlib.h>encode(){        char str1[300];        char str2[300];        int i=0;        int j=0;        int a[10] = {1,12,10,93,23,54,21,75,24,55};        printf("Vyvedi text do 300 simvola");        gets(str1);                             for (i = 0; str1[i] != '0'; i++)        {            str2[j] = str1[j] + a[j];            if (j = 9) j = 0;            else j++;                        }                puts(str1);        printf("nn");        puts(str2);        return 0;}decode(){        char str1[300];        char str2[300];        int i=0;        int j=0;        int a[10] = {1,12,10,93,23,54,21,75,24,55};                gets(str1);        printf("Vyvedi text do 300 simvola");                for (i = 0; str1[i] != '0'; i++)        {            str2[j] = str1[j] - a[j];            if (j = 9) j = 0;            else j++;                        }                puts(str1);        printf("nn");        puts(str2);        return 0; }main(){      int i = 0;      printf("Vyvedi chislo i natisni Enter :nn");      printf("1: Encoden2:Decode:nn");      scanf("%d", &i);            if ( i = 1 ) encode();      else if (i = 2) decode();      else {           printf("Nepravilen izbornn");            return main();            }                  system("PAUSE");      return 0;}

Проблемът е, че след компилация с Dev-C++ (просто само него имам, сега тегля Borland C++ Builder (но ще има да го тегля до утре.... ) при въвеждане на цифра (1 - за кодиране 2- за декодиране),  програмата сякаш сама въвежда някакви данни и после ми изкарва йероглифи и се прекратява.  

Много ще съм благодарен, ако някой ми помогне да разреша този проблем.

Редактирано от kalata23 (преглед на промените)

 

Много ще съм благодарен, ако някой ми помогне да разреша този проблем.

Пробвайте да четете опцията с getchar(). Или поне да флъшнете буфера на STDIN

Проблемът е, че след компилация с Dev-C++ (просто само него имам, сега тегля Borland C++ Builder (но ще има да го тегля до утре.... ) при въвеждане на цифра (1 - за кодиране 2- за декодиране), програмата сякаш сама въвежда някакви данни и после ми изкарва йероглифи и се прекратява. Много ще съм благодарен, ако някой ми помогне да разреша този проблем.

Проблемът ти не е в компилатора. Не смесвай форматиран(scanf) с неформатиран(gets) вход. Или си го флъшвай.

Или поне да флъшнете буфера на STDIN

Директното флъшване на stdin е извън стандарта и не трябва да се ползва. В общия случай остава един символ за край на ред, който трябва да се обере. Но както казах, най-доброто решение е да не се смесват.

Редактирано от flare (преглед на промените)

  • Автор

Проблемът ти не е в компилатора. Не смесвай форматиран(scanf) с неформатиран(gets) вход. Или си го флъшвай. Директното флъшване на stdin е извън стандарта и не трябва да се ползва. В общия случай остава един символ за край на ред, който трябва да се обере. Но както казах, най-доброто решение е да не се смесват.

Ок, замених 

scanf("%d", &i);

  с  

i = getchar();    

И пак същото.....  Общо взето дори, да избера опцията decode, пак тръгва функцията encode. Дали не прави проблем, че и двете функции връщат резултат 0 ?  

Ок, замених 

scanf("%d", &i);

  с  

i = getchar();    

И пак същото.....  Общо взето дори, да избера опцията decode, пак тръгва функцията encode. Дали не прави проблем, че и двете функции връщат резултат 0 ?  

Да не натискате ентър след като изберете режима?

...

Олее, чак сега ти погледнах програмата по-сериозно. Хващай учебниците пак :) Подсказка: знаеш ли, каква е разликата между операторите '=' и '=='? Подсказка 2: ако не почнеш да гледаш, какво ти изкарва компилатора, никога няма да пишеш смислен код. Подсказка 3: getchar връща char което в C е число. Обаче въвежда от клавиатурата символ. Сравняването на символ с число е съвсем легално и обикновено - грешно :)

Редактирано от flare (преглед на промените)

  • Автор

То и аз сега видях, че съм написал = вместо ==. :D: D :D Иначе знам, = е знак за присвояване на стойност == е знак за еквивалентност. Редакция: Дори след редакция на кода, пак няма разлика. А компилаторът не ми дава грешка.

Редактирано от kalata23 (преглед на промените)

То и аз сега видях, че съм написал = вместо ==. :D: D :D Иначе знам, = е знак за присвояване на стойност == е знак за еквивалентност.

Обърни внимание на подсказка 2. Компилатора сигурно е опищял света, за това, ама ти си го проспал. Гледай си warning-ите.
  • Автор

Така, програмата бачка, но въпросът е, има ли начин без да пускам програмата от comman prompt при въвеждане на масива да използвам Paste ?

Редактирано от kalata23 (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.