我是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;字符,循环似乎运行两次。 我不知道我的程序有什么问题。 请帮忙!
答案 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”