2015-07-10 2 views
0

Я пытаюсь написать программу на C, которая принимает n как целочисленный ввод, а затем вводит строки n. Проблема в том, что когда я запускаю программу, она принимает один вход меньше n. Если я вхожу в 1 в качестве первого ввода, программа просто заканчивается. Вот код:Проблемы при вводе строк в C

int n; 
scanf("%d", &n); 
char str[101]; 

while (n--) { 
    fgets(str, 101, stdin); 
    // other stuff... 
} 

Что я здесь делаю неправильно?

ответ

1

Помните, что нажатие клавиши ввода также отправляет символ в поток. Ваша программа не учитывает это. Используйте формат scanf(%d%*c), чтобы отменить второй символ.

int main(void) { 

    int n; 

    scanf("%d%*c", &n); 

    char str[101]; 

    while (n--) 
    { 
     fgets(str, 101, stdin); 

     // other stuff..... 
    } 

} 
3

Ваша программа будет работать, если вы используете scanf() для числа и входной строки.

#include <stdio.h> 

int main() 
{ 
    int n; 
    char str[101]; 
    scanf("%d", &n); 
    while (n--) 
    { 
     scanf("%s", str); 
    } 
    return 0; 
} 

Но это, возможно, лучше использовать fgets() для всех входов.

#include <stdio.h> 

int main() 
{ 
    int n; 
    char str[101]; 
    fgets(str, 100, stdin); 
    sscanf(str, "%d", &n); 
    while (n--) 
    { 
     fgets(str, 100, stdin); 
    } 
    return 0; 
} 

я едва должен напомнить вам, так как вы использовали fgets() в первую очередь, вы будете знать, что он сохраняет newline в конце строки ввода.

+2

Примечание: Лучше использовать 'fgets (ул, SizeOf, ул STDIN);' 1) должно быть 101 не 100 и 2) избежать магических чисел. +1 для «лучше использовать fgets() для всех входов». – chux

1
int n; 
scanf("%d", &n); 
char str[101]; 

while (n--) 
{ 
fgets(str, 101, stdin); 
// other stuff... 
} 

В этом, как вы вводите n и нажмите ENTER с клавиатуры '\n хранится в stdin поэтому как fgets встречает newline character, если возвращается.

Поэтому используйте это после scanf -

char c ; 
while((c=getchar())!=NULL && c!='\n'); 
Смежные вопросы