while (getchar ()! = несколько аргументов) - PullRequest
0 голосов
/ 06 ноября 2011

Как использовать getchar в качестве условия для цикла while и как его завершать, когда (c = getchar ()) = EOF или '\ n' или '\ 0'.

Я пытался:

int c=0;
while((c=getchar()) != EOF || '\n' || '\0'){
putchar();
}

Что не сработало, если я ввел: ПОГОДА (+ ввод). Это не прерывало цикл.

Как мне сделать эту работу?

Укрепи меня

Ответы [ 8 ]

5 голосов
/ 06 ноября 2011

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

int c = 0;
while((c=getchar()) != EOF) {
  if ((c == 0) || (c == '\n'))
    break;
  putchar(c);
}
3 голосов
/ 06 ноября 2011
while ((c = getchar()) != EOF && c != '\n' && c != '\0')
{
  // loop body
}

Это работает, потому что оператор && a) всегда сначала вычисляет выражение LHS, и b) вводит точку последовательности, поэтому любые побочные эффекты в выражении LHS (такие как присвоение результата getchar c) ) будет применяться до оценки выражения RHS.

2 голосов
/ 06 ноября 2011

Я думаю, что это должно работать:

int c;
while( (c=getchar()) != EOF && c!='\n' && c!='\0') {
    putchar();
}

но может быть лучше просто сделать:

int c=getchar();
while( c != EOF && c!='\n' && c!='\0'){
    putchar();
    c=getchar();
}
1 голос
/ 06 ноября 2011

К сожалению, вам нужно будет разбить его на несколько операторов.Вы пытаетесь выполнить логическое или несколько вещей, и, учитывая, что «истина» - это «все, что не равно нулю», а символы - это просто числа, большинство из которых не равны нулю, вы в основном говорите «в то время как с не является EOF,или ИСТИНА или ИСТИНА ".

Я не совсем уверен в спецификации C, но переписать утверждение следующим образом может работать:

while((c=getchar()) != EOF && c!='\n' && c!='\0')

Это может быть неопределенным, хотя в зависимости от порядкаоценки, и это выглядит грязно.

Лучшее решение состоит в том, чтобы переместить "c = getchar ()" в другое место и вместо этого проверить значения C в заголовке while.Это означает, что вам придется переместить "c = getchar ()" как вне цикла, так и в конец тела цикла while.

0 голосов
/ 14 ноября 2011

Если вы готовы отказаться от int c и использовать вместо него char, то можно кодировать его короче, используя стандартные библиотечные функции, сохраняя расширяемый «список исключений»:только для двух символов "break" это, вероятно, менее эффективно, чем явная последовательность тестов.

См. strpbrk() о том, что делает эта функция.

0 голосов
/ 06 ноября 2011

Довольно крупное, но очень индивидуальное решение может быть:

#include <stdarg.h>
#define END_INPUT -12332 // not likely to be returned from getchar()...
int is_any(int c, ...)
{
    va_list ap;
    va_start(ap, c);
    int ret = 0;
    while (ret == 0) {
        int a = va_arg(ap, int);
        if (a == END_INPUT) break; // End of inputs - not any of the given ones
        if (c == a) ret = 1; // will result in a break as well...
    }
    va_end(ap);
    return ret;
}

int main()
{
    int c;
    while( isany(c=getchar(), EOF, '\n', '\0', END_INPUT) {
        ...
    }
}
0 голосов
/ 06 ноября 2011

Это не работает, потому что EOF || '\n' || '\0' является логическим выражением, которое всегда будет иметь значение true, поэтому условие сводится к if( c != true ), что составляет только true, если c равно nul, что getchar () не будетобычно возвращает.

Присвоения в условиях всегда опрометчивы, и некоторые компиляторы выдают предупреждение, если само присваивание не заключено в круглые скобки.Это сделано для предупреждения случайного использования =, когда более обычное == было предназначено для условия.

В C вы должны иметь отдельные логические выражения, даже когда каждое тестирует одну и ту же переменную:

int c = getchar() ;
if( c != EOF && c != '\n' && c != '\0' )
    ...
0 голосов
/ 06 ноября 2011

Фактор вашего кода, например,

while (intint((int []){ EOF, '\n', 0 }, c=getchar(), 3) ...

Где intint - это функция, которую вы пишете как memchr, но она принимает массив целых чисел.: -)

Этот ответ наполовину шутка, поскольку другие ответы уже достаточно хорошо решают проблему, но дело в том, что зачастую определение правильной функции с правильным интерфейсом может значительно упростить ваш код.

...