2015-09-29 3 views
-2

ошибка в выходе из-за gets() ... как видно на рисунке ... программа печатает 0 перед ожиданием ввода пользователем строки. Мне нужно прочитать строку формата «click X», где X - целое число. Есть ли альтернатива gets() для использования в этой ситуации?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; 
} 

output of the above program....as it can be seen that instead of waiting for user to input string for action, it prints 0 .

+4

Пожалуйста, не размещать изображения текста. Скопируйте-вставьте его вместо этого. –

+0

ok ... спасибо за предложение – smasher

+0

вы можете его уточнить? – smasher

ответ

0

После '' зсапЕ использовать

getchar(); 

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

Не используйте 'получает', используйте '' fgets вместо

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

fgets(action, sizeof(action), stdin); 
+0

Правда, но не отвечает на вопрос. – interjay

+0

Как использовать fgets() в этой ситуации, так как я не использую какой-либо поток файлов? – smasher

+0

yup, он решил проблему, вероятно, потребляя лишнюю новую строку – smasher

1

Ваш 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)

+0

Проблема здесь в том, что вызов 'get' не запрашивает ввода пользователя вообще. Переключение на 'fgets' не изменит этого. Чтение дублированного вопроса будет. – interjay

+0

Почему вы вычитали 1 из sizeof (action) – smasher

+0

@smasher: моя ошибка, исправлена! –