如何在流中获取左侧角色?

时间:2015-07-13 12:30:08

标签: c stream getchar

以下是get_line的函数定义: -

  1. 在开头跳过空白。

  2. 先停在白色空间。

  3. 停在第一个换行符并将其放入数组中。
  4. 如果没有可用空间,请留下字符。
  5. 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;
    }
    

    但是当我输入更多的字符然后大小并尝试使用最后一个while循环打印main中的剩余字符时,它会打印奇怪的字符,而不是按照函数的第四个规范的要求打印流中的剩余字符。请告诉我为什么会这样?

2 个答案:

答案 0 :(得分:3)

看起来你与operator precedence发生了冲突。

在此声明中:

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

比较运算符!=的优先级高于赋值运算符=。因此,首先评估getchar() != '\n',因为它是布尔表达式,所以10将是1c = 1

假设下一个字符不是换行符,则值为1。然后评估getchar() != '\n',并通过将值0打印为char来继续循环。找到换行符后,c = 0的计算结果为while ( (c = getchar()) != '\n'){ ,然后评估<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="@android:anim/decelerate_interpolator"> <translate android:fromXDelta="0%" android:toXDelta="0%" android:fromYDelta="100%" android:toYDelta="0%" android:duration="250" /> 并退出循环。

您需要在此处添加括号以获得预期的操作顺序:

.box

答案 1 :(得分:2)

WhozCraig指出您的问题是运营商优先级。这就是:

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

while语句的条件表达式中,首先评估expersion getchar() != '\n'。然后将结果分配给c。该表达式产生了对getchar()的调用的比较结果,'\n'检索下一个字符,并使用常量字符值!=

根据比较运算符\n的实现方式,您可以获得奇怪的字符。请注意,C中的布尔值“true”定义为非零,布尔值“false”定义为零。例如,编译器从'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) 的字节值并测试非零是完全合法的。在汇编程序中,这看起来像:

numbers = text.scan(/([^A-Z|^"]{6,})/i).collect{|x| x[0].strip }