for循环在C中运行两次

时间:2014-04-20 06:09:56

标签: c

我是C编程新手。我正在练习,问题是这样的:使用?:运算符和for语句编写一个程序,该程序一直记录用户输入的字符,直到字符q被计算。

这是我写的程序:

#include <stdio.h>

main()
{
    int x, i=0;
    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n",i))
    {
        printf("Enter q to exit!!!\n");
        printf("Please enter a character:\n");
        x=getc(stdin);
        putc(x,stdout);
        ++i;
    }
    printf("\nThe for loop is ended. Bye!");

    return 0;       
}

问题是:每次我输入&#34;非q&#34;字符,循环似乎运行两次。 我不知道我的程序有什么问题。 请帮忙!

4 个答案:

答案 0 :(得分:4)

当您输入非q字母时,您还会点击 Enter ,这将在第二个循环中读取。

要使循环仅针对每个输入运行一次,请使用fgets()一次读取整行输入,并检查输入字符串是否符合您的期望。

答案 1 :(得分:3)

当您键入a然后按Enter时,换行符将成为stdin流的一部分。读取a后,下次执行x=getc(stdin)时,x的值将设置为\n。这就是为什么循环的两次迭代被执行的原因。

答案 2 :(得分:1)

循环运行两次,因为当您输入非q字符时,实际上输入了两个字符 - 非q字符和换行符'\n'字符。 x = getc(stdin);会从q信息流中读取非stdin字符,但换行符仍位于stdin的缓冲区中,该缓冲区将在下一个getc调用中读取

您应该使用fgets从其他人建议的流中读取一行,然后您可以处理该行。此外,您应将main的返回类型指定为int。我建议进行以下更改 -

#include <stdio.h>

int main(void)
{
    int x, i = 0;

    // array to store the input line
    // assuming that the max length of
    // the line is 10. +1 is for the 
    // terminating null added by fscanf to
    // mark the end of the string
    char line[10 + 1];

    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n", i))
    {
        printf("Enter q to exit!!!\n");
        printf("Please enter a character:\n");

        // fgets reads an input line of at most 
        // one less than sizeof line, i.e., 
        // 10 characters from stdin and saves it 
        // in the array line and then adds a 
        // terminating null byte
        fgets(line, sizeof line, stdin);

        // assign the first character of line to x
        x = line[0];
        putc(x, stdout);
        ++i;
    }
    printf("\nThe for loop is ended. Bye!");

    return 0;       
}

答案 3 :(得分:1)

当你输入一个字符,说'x'然后按回车键,你实际输入了两个字符,分别是'x'和'\ n',也称为换行符(当你按Enter键时)。 '\ n'成为输入流的一部分,并且也为它执行循环。

此外,尝试输入“xyz”并按Enter键,循环将执行4次。对于每个'x','y','z'和'\ n'。

如果您希望代码对每个输入都工作一次,请使用函数gets。

#include <stdio.h>

main()
{
    int i=0;
    char x[10];
    for ( ; x[0]!='q'; printf("Loop %d is finished\n",i) )
    {
        printf("Enter q to exit!!!\n");
        printf("Please enter a character:\n");
        gets(x);
        i++;
    }
    printf("\nThe for loop is ended. Bye!");

    return 0;
}

在这段代码中,我们将x声明为字符串,gets()函数读取我们输入的整行,然后在for循环的条件部分,我们检查字符串的第一个字符是否为“q”