Проблема с getchar в C - PullRequest
2 голосов
/ 05 июня 2011

Я хочу написать программу, которая может: когда я вхожу, скажем " Алан Тьюринг ", он выдает " Тьюринг, A ". Но для моей следующей программы она выдает « uring, A », я долго думал, но не смог понять, куда идет T . Вот код:

#include <stdio.h>
int main(void)
{
char initial, ch;

//This program allows extra spaces before the first name and between first name and second name, and after the second name.

printf("enter name: ");

while((initial = getchar()) == ' ')
    ;

while((ch = getchar()) != ' ')  //skip first name
    ;

while ((ch = getchar()) == ' ')
{
    if (ch != ' ')
        printf("%c", ch);  //print the first letter of the last name
}
while((ch = getchar()) != ' ' && ch != '\n')
{
    printf("%c", ch);
}
printf(", %c.\n", initial);

return 0;
}

Ответы [ 3 ]

3 голосов
/ 05 июня 2011

Ваша ошибка здесь:

while ((ch = getchar()) == ' ')
{
    if (ch != ' ')
        printf("%c", ch);  //print the first letter of the last name
}
while((ch = getchar()) != ' ' && ch != '\n')
{
    printf("%c", ch);
}

Первый цикл читает символы, пока не найдет не пробел.Это твое "Т".Затем второй цикл перезаписывает его следующим символом 'u' и печатает его.Если вы переключите второй цикл на do {} while();, он должен работать.

2 голосов
/ 05 июня 2011
while ((ch = getchar()) == ' ')
{
    if (ch != ' ')
        printf("%c", ch);  //print the first letter of the last name
}

Эта часть неверна.if там никогда не будет совпадать, потому что этот блок запускается, только если ch == ' '.

while ((ch = getchar()) == ' ');
printf("%c", ch);  //print the first letter of the last name

должен исправить это.

Обратите внимание, что getchar возвращает int, а не символЕсли вы хотите проверить конец файла в какой-то момент, это будет вам байт, если вы сохраните возвращаемое значение getchar в char.

0 голосов
/ 05 июня 2011

Использование getchar () для чтения строки из стандартного ввода не очень эффективно. Вы должны использовать read () или scanf (), чтобы прочитать входные данные в буфер и затем поработать над строкой. Это будет намного проще.

Во всяком случае, я добавил комментарий, где ваша ошибка.

while((ch = getchar()) != ' ')  //skip first name
    ;

// Your bug is here : you don't use the character which got you out of your first loop.

while ((ch = getchar()) == ' ')
{
    if (ch != ' ')
        printf("%c", ch);  //print the first letter of the last name
}
...