我只是在学习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");
}
}
答案 0 :(得分:2)
你可以做你想做的事情,而不是你做的事情......
对于初学者,您必须始终验证scanf
的返回值。你必须防止三种情况:
EOF
- 意味着在遇到任何输入之前已达到输入结束(这可以由用户通过按 Ctrl + d (或 1 )上输入> Ctrl + z ;
返回的转换说明符数量少于指示匹配或输入失败(当发生这种情况时,从流停止提取字符并你负责在下次尝试阅读之前删除任何无关的字符);或
返回值等于转换说明符的数量 - 表示数据已转换并存储在您提供的每个变量中;
此外,您必须验证收到的输入是否在可接受的范围内。 (您可能不希望否定值输入。
对于您的代码,您只需验证上面的(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
仔细看看,如果您有其他问题,请告诉我。
<强>脚注强>