2016-10-06 2 views
-4

Я пытаюсь написать фрагмент кода, который запрашивает ввод пользователя для ввода имени. Затем он должен читать каждый символ своего имени и форматировать его, но я выбираю (в коде ниже он добавляет новую строку после каждого символа).Почему первая буква моей строки не печатается?

Проблема, с которой я сталкиваюсь, - это когда кто-то печатает свое имя, он не печатает первую букву, а распечатывает остальную.

Например, если бы я набрал Sneek, он отображает только neek.

Теперь я начинаю программировать и тем более с C, поэтому мне было интересно, есть ли проблема с моей инструкцией scanf или циклом.

Кроме того, если я набираю Sneek, он отображает neek, но если я снова наберу Sneek, он отобразит его как Sneek, поэтому я предполагаю, что в петле нет ничего плохого?

Я искал довольно долгое время по этому вопросу, но я не могу найти ответы, любая помощь будет высоко оценена.

char ch; 
printf("Please enter name: "); 
ch = scanf("%c", &ch); 

while ((ch = getchar()) != EOF) { 
    printf("%c\n", ch); 

} 
return 0; 
+0

http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc – Lundin

+1

'getchar' преднамеренно возвращает' int', не 'char'! 'ch = scanf (..., & ch)' просто неправильно.Прочтите документацию о функциях, которые вы используете! – Olaf

ответ

2

Есть несколько вопросов в фрагменте кода:

  • ch = scanf("%c", &ch); не служит никакой цели и не даже правильно прочитать байт из файла в ch. Обратите внимание, что scanf хранит байт в ch, но он сразу же перезаписывается при сохранении возвращаемого значения в ch. Просто удалите эту строку.

  • while ((ch = getchar()) != EOF) { printf("%c\n", ch); } является правильным для вашей цели, но тип chдолжен быть int вместо char, чтобы вместить все значения unsigned char и особое значение EOF. Как написано, ваш код не будет остановлен в конце файла на платформах, где char является неподписанным типом.

+0

Я согласен с тем, что 'scanf()' не полезно, но что из того, что «даже неправильно читает байт из файла»? Это выглядит хорошо для меня, если вы не жалуетесь, что он не проверяет, был ли символ успешно прочитан, что должно быть охарактеризовано по-разному (так как «вы не проверяете работу операции ввода-вывода»). –

+0

@JonathanLeffler: оскорбительный 'scanf()' считывает байт из файла, сохраняет его в 'ch' и затем возвращает 1, если он успешный, который, в свою очередь, сохраняется в той же переменной' ch'. Для аргумента, байт правильно читается из потока, но его значение не сохраняется должным образом для дальнейшего использования ;-) – chqrlie

+0

Ah; Я пропустил присвоение 'ch' (а также использовал его в списке аргументов). Да; это ужасно - и «неправильно читает» точно. Я должен был заметить это злоупотребление, но, возможно, вы могли бы указать, насколько это плохо (это может быть не очевидно каждому). –

2

Комментарий ch = scanf("%c", &ch);. Вы потребляете первого персонажа и никогда не печатаете его.

0

Эта инструкция считывает символ со стандартного ввода через scanf.

ch = scanf("%c", &ch); 

Этот цикл считывает символы из стандартного ввода с помощью getchar.

while ((ch = getchar()) != EOF) { 
    printf("%c\n", ch); 

} 

Что происходит с первым символом после чтения с scanf? Он перезаписывается результатом getchar.

0

Я не вижу проблемы. Вы получаете первого персонажа. После этого вы получаете и печатаете символы до EOF.

Это не печать первого символа, потому что вы не сказали об этом.

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