2014-01-18 2 views
4

я сделал программу, которая принимает строки (имена/фамилии), но вместо типичного выхода
Фил Snowken 3 лет, я получаю
Фил
Snowken
возраст 3Почему printf() при печати нескольких строк (% s) оставляет новую строку и как ее решить?

#include <stdio.h> 
#define N 10 
struct data{ 
char fname[30]; 
char lname[30]; 
int age; 
}; 

main() 
{ 
    int i; 
    struct data base[N]; 
    for(i=0;i<N;i++){ 
     printf("\n-------------------------"); 
     printf("\nPeople Data(%d remaining)\n",N-i); 
     printf("---------------------------\n\n"); 
     printf("\nFirst Name "); 
     fgets(base[i].fname,30,stdin); 
     printf("\nLast Name "); 
     fgets(base[i].lname,30,stdin); 
     printf("\nAge "); 
     scanf(" %d",&(base[i].age)); 
     fflush(stdin); 
    } 

    for(i=0;i<N;i++) 
     printf("%s %s Year:(%d)",base[i].fname,base[i].lname,base[i].age); 
    return 0; 
} 
+0

Это может быть проблема компилятора Я не уверен – hitter

+2

'fgets()' считывает максимум один меньше, чем * размер * символов из * поток * и сохраняет их в буфер, указанный на * s *. Чтение останавливается после EOF или новой строки. ** Если прочитана новая строка, она сохраняется в буфере. ** –

+1

Удалите 'fflush (stdin)'. Он вызывает неопределенное поведение. – haccks

ответ

4

fgets() читает переводы строк с введенной строкой, поэтому каждый раз, когда вы нажимаете кнопку ввода, он получает \n, также читаемый в строку (см. man fgets)

Вы должны проверить последний символ, и если это \n изменить его к \0, как это:

size_t length = strlen(base[i].fname); 
if (base[i].fname[length-1] == '\n') 
    base[i].fname[length-1] = '\0'; 
+0

Как насчет того, объявить 'length' как' int'? – hitter

+0

@niCk он будет работать, вы, вероятно, получите предупреждение о компиляции, хотя, поскольку 'strlen' возвращает' size_t' – prajmus

+1

@prajmus: существует неявное преобразование от 'size_t' к' int', поэтому предупреждение маловероятно. niCk: Но почему вы хотите объявить 'length' как' int'? Вероятно, это не вызовет каких-либо проблем, но для него просто разумнее быть 'size_t'. –

Смежные вопросы