2013-06-09 2 views
0

Я пишу простую программу, которая принимает данные о людях в этом формате: имя, возраст, пол, данныеC - printf() работает неправильно?

и он будет отображать их как этот [название:, возраст:, пол:, информация: ]

Вот мой код до сих пор:

#include <stdio.h> 

int main() { 
char name[10]; 
int age; 
char gender[2]; 
char info[50]; 

while(scanf("%9[^,],%i,%c,%49[^\n]", name, &age, gender, info) == 4) { 
    printf("[name: %s, age: %i, gender: %c, info: %s]\n", name, age, gender, info); 
} 

return 0; 

}

так что я решил написать свой вывод в другой текстовый файл с помощью>. И он правильно отображает n, дисплей] отображается на новой строке и [имя: сам по себе.

Это мой вход:

eliza,7,F,likes animals 
bob,9,M,fast at running 
sue,6,F,likes painting 

И выход:

[name: eliza, age: 7, gender: J, info: likes animals 
] 
[name: 
bob, age: 9, gender: J, info: fast at running 
] 
[name: 
sue, age: 6, gender: J, info: likes painting 
] 

Может кто-то помочь? Я не могу понять, почему он печатает такие данные, я попытался использовать strstr(), чтобы проверить, содержит ли какая-либо из моих переменных новый символ строки.

+0

Я думаю, это для Windows? – Dave

+0

Да, это что-то влияет на что-нибудь? – tenkii

+2

Да; line endings в Windows являются '\ r \ n' не просто' \ n' – Dave

ответ

3

У вас есть две проблемы. Во-первых, я считаю, что это окна (или, по крайней мере, файл, который вы читаете, был создан в Windows), что означает, что у вас есть \r\n не только \n в конце строки. Вы можете исправить это, открыв файл в текстовом режиме, но это ненадежно; лучше отфильтровать дополнительные \r вручную.

Это то, что помещает новую строку после каждого поля «информация».

Вторая проблема заключается в том, что вы отклоняете \n из информационного поля, поэтому он по-прежнему присутствует в качестве первого символа для последующих полей «имени», поэтому у вас есть лишний разрыв строки. Чтобы исправить это, просто поставьте пробел в начале строки scanf (которая проглотит все пробелы)

И Вдохновленный указывает на ваш третий номер (чего я не заметил); вам нужно рассматривать пол как символ, а не строку. "Правильный" способ читать его, как это:

char gender; // no need to have an array of characters 
scanf("blah %c blah", &gender); 

и печати, как:

printf("blah %c blah", gender); 
+0

Извините, я немного смущен.Прямо сейчас у меня есть scanf, например: scanf ("% 9 [^,],% i,% c,% 49 [^ \ r \ n]", имя, возраст и пол, информация) Вы сказали, что я может выбрать просто отфильтровать \ r, но я решаю отфильтровать оба \ r \ n. Но если фильтр на BOTH, мне кажется, нужно пространство после первой строки, почему? Должен ли новый символ линии исчезнуть с тех пор, как я фильтрую оба? – tenkii

+0

@miniJavaLearner нет, они являются отдельными проблемами; потому что ваше информационное поле * отклоняет * новые строки, они хранятся в потоке для следующего вызова для чтения. Вот почему вы также * нуждаетесь в пространстве в начале или конце строки, чтобы явно проглотить его. – Dave

+0

Хорошо, теперь я понимаю, спасибо за вашу помощь. – tenkii

0
#include <stdio.h> 

int main(void) { 
    char name[10]; 
    int age; 
    char gender;//change 
    char info[50]; 

    while(scanf("%9[^,],%i,%c,%49[^\n]%*c", name, &age, &gender, info) == 4) { 
     printf("[name: %s, age: %i, gender: %c, info: %s]\n", name, age, gender, info); 
    } 

    return 0; 
} 
+0

Это оставит новую строку в конце информации, потому что '\ r' все еще существует. – Dukeling

+1

@ Дублирование в окнах '\ r \ n' convert (I/O: in \ r \ n -> \ n, out \ n -> \ r \ n) в' \ n'. (режим не двоичный) – BLUEPIXY

+0

@ BLUEPIXY не двоичный режим не является надежным способом фильтрации. Например, при работе в Linux, но с файлом, сгенерированным на окнах. – Dave

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