在C

时间:2018-05-25 04:07:41

标签: c unix scanf

我只是在学习C而我遇到了基本理解的问题。我试图做的是打印X与输入相同的次数。输入都在同一条线上,我现在运作良好。

我遇到的问题是结束程序。我想要做的是在读取行之后让程序结束。

示例:输入1 2 3

输出:

X
XX
XXX

计划结束

现在我只是在循环中......

任何人都可以尝试解释我在这里缺少的概念吗?我确定这可能是一种语法问题,但我真的想要了解我的逻辑错误。

在这种情况下EOF如何工作?

    int main(void)

{

int i;

int n = 0;

while ( n  != EOF ) {

scanf( "%d",&n );

    if (n == EOF){

    break;

    }

        for ( i=0; i<n; i++){

        printf("X");
    }

    printf("\n");

}

}

1 个答案:

答案 0 :(得分:2)

你可以做你想做的事情,而不是你做的事情......

对于初学者,您必须始终验证scanf的返回值。你必须防止三种情况:

    返回
  1. EOF - 意味着在遇到任何输入之前已达到输入结束(这可以由用户通过按 Ctrl + d (或 1 )上输入> Ctrl + z ;

  2. 返回的转换说明符数量少于指示匹配输入失败(当发生这种情况时,从流停止提取字符并负责在下次尝试阅读之前删除任何无关的字符);或

  3. 返回值等于转换说明符的数量 - 表示数据已转换并存储在您提供的每个变量中;

  4. 此外,您必须验证收到的输入是否在可接受的范围内。 (您可能不希望否定值输入。

    对于您的代码,您只需验证上面的(3)并退出EOF,或匹配输入失败 - 因为您只是读取1种类型的数据(integers),并且可以在任何失败时退出。

    但这并不能解决你的问题。解决此问题的正确方法是一次读取一行数据(使用fgets或POSIX getline),然后通过重复调用{{1}来解析数据行中的每个整数值并利用其strtol参数来完成整条生产线。 (关于其正确使用的SO有很多例子)

    但是,您也可以通过在使用endptr阅读每个int之后检查下一个字符来执行您想要做的事情,如果它是getchar(),那么您的阅读就完成了,否则你需要使用'\n' 将角色重新放回stdin并验证回放是否成功? (提示:检查返回 - 每个C库函数的返回都在关联ungetc中清楚地描述 - 使用它们man page

    完全放弃,你可以做类似的事情:

    :)

    示例使用/输出

    #include <stdio.h>
    
    int main (void) {
    
        int i, n;
    
        printf ("input: ");
    
        while (scanf ("%d", &n) == 1) { /* validate the 'return' of scanf */
            if (n < 0) {    /* validate n not negative */
                fprintf (stderr, "error, input cannot be negative.\n");
                return 1;
            }
            for (i = 0; i < n; i++)     /* then loop that number of times   */
                putchar ('X');          /* don't printf 1-char, use putchar */
            putchar ('\n');             /* tidy up with newline */
    
            i = getchar();      /* read next char in stdin */
            if (i == '\n')      /* if end of line - break (done) */
                break;
            else if (ungetc (i, stdin) != i) {  /* validate putting it back */
                fprintf (stderr, "error: putting char back in stdin.\n");
                return 1;
            }
        }
    
        return 0;
    }
    

    $ ./bin/output_x
    input: 1 2 3
    X
    XX
    XXX
    

    仔细看看,如果您有其他问题,请告诉我。

    <强>脚注

    1. 但请参阅:CTRL+Z does not generate EOF in Windows 10