2015-12-08 2 views
0

У меня есть этот код:Почему он игнорирует второй символ

#include <stdio.h> 
#include <ctype.h> 

int main() 
{ 
    char x; 
    printf("Program shows your name and check if the first letter is capital"); 
    while (scanf_s("%c", &x) !=1 || getchar() !='\n') 
    { 
     if (islower(x)) 
     { 
      printf("Name begins with a capital letter\n"); 
      while (getchar() != '\n') 
       ; 
     } 
     else 
     { 
      printf("%c", x); 
     } 
     break; 
    } 
    while ((x = getchar()) != EOF) 
    { 
     printf("%c", x); 
    } 
     return 0; 
} 

Например: Когда я типа «Мэтью» Результат «Mtthew». Что не так? Я понятия не имею. Я попытался изменить почти все в первом «пока», но я думаю, что проблемы там нет. Есть идеи?

+2

3 в то время как петли для этой функции? возможно, вам стоит подумать о повторной записи его – Idos

+1

Вы должны объявить x как 'int', если вы сравниваете его с EOF. Также 'int main()' должен быть 'int main (void)'. –

+0

Не уверен, но я думаю, что перерыв после еще должен быть внутри блока else – Cherubim

ответ

3

Функция getChar() удаляет символ из входного потока, так что его больше нет. Используя его в своем условном операторе, это:

  • Получение символа из потока (иначе: его удаления)
  • Сравнивая его, и, наконец,
  • Отбросив его (без сохранения его где-нибудь)

Если вы реорганизовывать код, чтобы рассмотреть это, то я считаю, ваша тайна персонаж вернется :-)

0

Измените первый while на

while ((x = getchar()) != EOF && x != '\n') 

EDIT: И изменить char x к int x потому EOF не гарантированно представима char.

+0

Спасибо, теперь все работает отлично. – Matth3w

0

Ваша программа работала без пропуска символа, когда были внесены следующие изменения: (см комментарии рядных)

int x; //change to int for use with getchar() 
printf("Program shows your name and check if the first letter is capital"); 
while (scanf("%d", &x) !=1 || getchar() !='\n') 
      ^//changed to d for int 

Но комментарий сделано в @ J.Murray Ответим о getchar() еды символ действителен , Поэтому, хотя ваша программа работала для меня, есть несколько входных последовательностей, для которых это не будет.

Примечание: Причина использования int в отличие от char является то, что getchar() может возвращать EOF, который == -1. A char не может содержать -1.

0

Конечно неправильное использование scanf_s("%c", &x)

Функция fscanf_s эквивалентна fscanf исключением того, что C, S и [спецификаторы преобразования применяются к паре аргументов (если подавление присваивания не обозначено *). Первый из этих аргументов такой же, как и для fscanf. Этот аргумент сразу же следует в списке аргументов вторым аргументом, который имеет тип rsize_t и дает количество элементов в массиве, на которые указывает первый аргумент пары. (C111dr §K.3.5.3.2 6) может существовать

scanf_s("%c", &x, (rsize_t)1) 

Другие проблемы.

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