gets() вызывает ошибку вывода

ошибка в выводе из-за gets()... как это видно на изображении... программа печатает 0, прежде чем ждать, пока пользователь введет строку. Мне нужно прочитать строку формата «щелкнуть X», где X — целое число. Есть ли альтернатива gets() для использования в этой ситуации?

 #include<stdio.h>
#include<stdlib.h>
int main()
{
    int n,k,i;
    char action[10];
    int *open;
    scanf("%d%d",&n,&k);                                    
    open= calloc( sizeof(int),n);               

    for(i=0;i<n;i++)
    {
        open[i]=0;
    }


    for(i=0;i<k;i++)
    {                                                     
        //gets to read an input  as "click 1"
      gets(action); 
      printf("%d\t%c",i,action[6]);     
    }
    free(open);                                                         
    return 0;
}

вывод вышеуказанной программы.... как видно, вместо того, чтобы ждать, пока пользователь введет строку для действия, она печатает 0 .


person smasher    schedule 29.09.2015    source источник
comment
Пожалуйста, не размещайте изображения текста. Вместо этого скопируйте и вставьте его.   -  person Some programmer dude    schedule 29.09.2015
comment
хорошо... спасибо за предложение   -  person smasher    schedule 29.09.2015
comment
можете уточнить?   -  person smasher    schedule 29.09.2015
comment
Уточнить что? Вы прочитали все ответы на связанный вопрос?   -  person interjay    schedule 29.09.2015
comment
Японял твою точку зрения. есть ли альтернатива этой ситуации?   -  person smasher    schedule 29.09.2015
comment
Да, альтернативой является выполнение одного из действий, предложенных в ответах на повторяющийся вопрос.   -  person interjay    schedule 29.09.2015
comment
Я не уверен, что это дубликат, возможная причина - calloc для int, тогда как gets для char (хотя я могу быть совершенно неправ)   -  person Potato    schedule 29.09.2015


Ответы (2)


Ваш action, вероятно, объявлен слишком коротким. Пытаться

  char action[64];

вместо.

Затем замените

  gets(action); /// BAD CODE

с участием

  fflush (NULL);
  memset (action, 0, sizeof(action));
  fgets  (action, sizeof(action), stdin);

Вам не следует никогда использовать gets, это устарело.

(используйте fflush для очистки выходного буфера; memset очищает буфер action; fgets считывает из него не более 63 байтов из stdin, поэтому вы уверены, что action заканчивается нулевым байтом, как и должна быть каждая строка C)< / суп>

Вы должны попросить свой компилятор предоставить вам все предупреждения и информацию об отладке, например. используйте gcc -std=c99 -Wall -Wextra -g при использовании GCC.

Вам следует научиться использовать отладчик (например, gdb)

person Basile Starynkevitch    schedule 29.09.2015
comment
Проблема здесь в том, что вызов gets вообще не запрашивает ввод данных пользователем. Переход на fgets этого не изменит. Чтение повторяющегося вопроса будет. - person interjay; 29.09.2015
comment
почему вы вычли 1 из sizeof(action) - person smasher; 29.09.2015
comment
@smasher: моя ошибка исправлена! - person Basile Starynkevitch; 29.09.2015

После использования 'scanf'

getchar();

для использования дополнительной новой строки. Поскольку «scanf» не может отбрасывать новую строку, первая итерация «gets» принимает новую строку.

Не используйте gets, используйте fgets

Вы можете использовать 'fgets()' как

fgets(action, sizeof(action), stdin);
person ashiquzzaman33    schedule 29.09.2015
comment
Верно, но не отвечает на вопрос. - person interjay; 29.09.2015
comment
как использовать fgets() в этой ситуации, поскольку я не использую файловый поток? - person smasher; 29.09.2015
comment
да, это решило проблему, вероятно, потребляющую дополнительную новую строку - person smasher; 29.09.2015
comment
@interjay, ответ отредактирован. - person ashiquzzaman33; 29.09.2015