2015-07-13 3 views
2

Вот определение функции get_line, которые: -Как получить левый символ в потоке?

  1. пропустить пробелы в начале.

  2. остановка вначале пробел.

  3. остановить символ первой строки и поместить его в массив.
  4. оставить символ, если у него нет свободного места.

int get_line (char* ch, int n) 
{ 

    if (n <= 0) 
     return 0; 

    char c; 

    while (isspace(c = getchar())); 
    int i = 0; 

    do { 
     ch[i++] = c; 
     if (i == n) 
      break; 
    }while (! isspace(c = getchar())); 

    if (c == '\n') 
     ch[i++] = '\n'; 

    ch[i] = '\0'; 
    return i; 
} 

int main() 
{ 

    char array[5]; 

    get_line(array, 4); 
    printf("%s", array); 

    char c; 

    while ((c = getchar()) != '\n'){ 
     printf("\n%c", c); 
    } 
    return 0; 
} 

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

+2

FYI, вы можете проверить [оператор приоритет] (http://en.cppreference.com/w/c/language/operator_precedence) из '(с = getchar()! = '\ n'') '. Просто говорю... – WhozCraig

+0

@WhozCraig ya it done – YakRangi

+0

@WhozCraig можно объяснить немного – YakRangi

ответ

3

Похоже, вы бежали от operator precedence.

В этом заявлении:

while (c = getchar() != '\n'){ 

Сравнение оператор != имеет более высокий приоритет, чем оператор присваивания =. Итак, getchar() != '\n' оценивается первым и будет либо 1, либо 0, так как это булево выражение.

Предполагая, что следующий символ не является символом новой строки, значение будет 1. Затем оценивается c = 1 и цикл продолжается путем печати значения 1 в качестве символа. Когда найдена строка новой строки, getchar() != '\n' оценивает до 0, затем оценивается c = 0, и цикл завершается.

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

while ((c = getchar()) != '\n'){ 
2

WhozCraig указал, что ваша проблема является оператором старшинства. Это то, что происходит:

while (c = getchar() != '\n'){ 
    printf("\n%c", c); 
} 

В условии выражения вашей while заявления, сначала experssion getchar() != '\n' оценивается. Затем результат этого присваивается c. Выражение дает результат сравнения вызова с номером getchar(), который извлекает следующий символ с постоянным значением символа '\n'.

В зависимости от того, как реализован оператор сравнения !=, вы можете получить странные символы. Обратите внимание, что логическое значение «true» в C определяется как ненулевое и логическое «false» как ноль. Например, было бы совершенно законно для компилятора вычесть значение байта \n из результата 'getchar() и проверить отличное от нуля. В ассемблере это будет выглядеть примерно так:

call getchar 
sub ax, 0x0d ' getchar result in ax; subtract \n from it 
mov c, ax  ' move result of subtraction to variable c 
jz  end_loop ' end loop if zero (= equal) 
Смежные вопросы