Как вы игнорируете числовой ввод, используя getchar и putchar

Я новичок в программировании на C. Один из моих вопросов задания доставляет мне трудное время. Вот:

Напишите программу ANSI-C, которая использует getchar() для чтения символов из стандартного ввода и использует putchar() для вывода только букв, пробелов (' ') и новых строк из ввода в стандартный вывод. Если буквы строчные, ваша программа должна преобразовать их в прописные. Например, учитывая следующий ввод:

There are 6 apples and 8 oranges, also 9 bananas ...... @ Apple Store!! See you there!?
вывод вашей программы должен быть:
THERE ARE APPLES AND ORANGES ALSO BANANAS APPLE STORE SEE YOU THERE

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

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int c;

    while ((c=getchar())!=EOF) {
        if ((c>='a' && c<='z'))
            c -= 32;
        else
            while((c==getchar())<'a' || (c==getchar())>'z' ||(c==getchar())!='\n' ||(c==getchar())!=' ');  //This is where I am having trouble.
        putchar(c);
    }
}

person livin_DA_Life    schedule 26.09.2015    source источник
comment
Пожалуйста, покажите нам свой код.   -  person Kninnug    schedule 27.09.2015
comment
покажите нам свой код, чтобы мы могли вам помочь.   -  person Nitin Tripathi    schedule 27.09.2015


Ответы (3)


Используйте isalpha, isspace и toupper в <ctype.h> вот так

while ((c=getchar())!=EOF) {
    if(isalpha(c) || isspace(c))// isspace allow '\t' => c == ' ' || c == '\n'
        putchar(toupper(c));
}
person BLUEPIXY    schedule 26.09.2015
comment
Это именно то, что будет делать то, что вы хотите, самым простым способом. Он будет игнорировать все, что не является письмом. Это также отталкивает множественные проверки ветвей, которые вы разместили в файле while. Просто убедитесь, что вы включили эту библиотеку ctype. Функции, написанные под этим ответом, в то время были бы хороши, если вы хотите полностью понять, что делается под ним, но это то, что вам нужно, если это точка подчинения. Также не слишком уверен, если вы хотите убедиться, что ваш вывод не содержит несколько пробелов, для этого потребуется немного поискать. - person L.P.; 27.09.2015

Просто используйте функцию isdigit, чтобы проверить, является ли символ цифрой или нет. Если это не цифра, обработайте ее, как сейчас. В противном случае просто проигнорируйте его и попробуйте прочитать другой символ.

person Paul92    schedule 26.09.2015

Вы можете использовать что-то вроде этого:

char char_filter(char c)
{
    /* lower case letters */
    if (c >= 'a' && c <= 'z')
        return c - ('a' - 'A');

    /* upper case letters*/
    if (c >= 'A' && c <= 'Z')
        return c;

    /* space and new line */
    if (c == ' ' || c == '\n')
        return c;

    /* other characters */
    return 0;
}

Здесь, если функция возвращает ноль, символ следует пропустить, иначе он должен быть напечатан putchar:

char c;
while ((c = getchar()) != EOF) {
    if ((c = char_filter(c)))
        putchar(c);
}

Обратите внимание, что существуют также стандартные функции int islower(int c), int isupper(int c) и int isspace(int c). Функция isspace() считает пробелом также '\t', '\n' и некоторые другие символы.

person Orest Hera    schedule 26.09.2015