C 使用fprintf引起的无限循环
我试图将用户输入的字符串打印到文件中(作为字符),并在用户输入结束时停止打印。当我运行代码时,似乎创建了一个无限循环,并且有大量C 使用fprintf引起的无限循环,c,C,我试图将用户输入的字符串打印到文件中(作为字符),并在用户输入结束时停止打印。当我运行代码时,似乎创建了一个无限循环,并且有大量▯将打印到文件中。我不知道怎么了 代码如下: printf("Please input a character string, no spaces: \n\n"); scanf("%c", &c); //assigns user input to c var while ((c >= '0') && (c &
▯代码>将打印到文件中。我不知道怎么了
代码如下:
printf("Please input a character string, no spaces: \n\n");
scanf("%c", &c); //assigns user input to c var
while ((c >= '0') && (c <= '9')) { //check char is an integer
fprintf(f, "%c", &c);
if (c == 0x0A) {
fprintf(f, "\n\n");
fclose(f);
}
}
printf(“请输入字符串,无空格:\n\n”);
scanf(“%c”、&c)//将用户输入分配给c变量
而((c>='0')&&(c首先,学习如何以可靠、简单的方式读取字符串。在几乎所有情况下,当涉及到读取字符串时,请忘记scanf
,并学习使用fgets
。其次,您的根本问题是,您正在读取单个字符,然后在该字符上无休止地循环。您没有读取字符串,而且从未检查过输入或输出多于他们输入的第一个字符
试着这样做:
char str[129];
printf("Please input a character string, no spaces: \n\n");
fgets(str, sizeof(str), stdin);
size_t len = strlen(str);
for (size_t i = 0; i < len; i++)
{
char c = str[i];
if(c == 0x0A)
break;
if (c >= '0') && (c <= '9')) //check char is an integer
fprintf(f, "%c", c);
}
fprintf(f, "\n\n");
fclose(f);
charstr[129];
printf(“请输入字符串,无空格:\n\n”);
fgets(str,sizeof(str),stdin);
尺寸长度=strlen(str);
对于(大小i=0;i 如果(c>='0')&(c您有一个无限循环,因为您没有在while
循环中修改c
变量,因此条件总是计算为相同的值
此外,您不打印字符:您传递的是c
的地址,而不是其值。这会调用未定义的行为,因为地址不适合%c
转换说明符
以下是更正的版本:
printf("Please input a character string, no spaces:\n\n");
c = 0;
while (scanf("%c", &c) == 1 && (c >= '0') && (c <= '9')) {
fprintf(f, "%c", c);
}
if (c == '\n') {
fprintf(f, "\n\n");
fclose(f);
}
告诉我们,循环中的哪一行更改了c
的值?如果您可以回答,那么您将回答您自己的问题。同意@kaylum,并且您还将变量c的地址打印为字符。请注意,打印消息中的文本具有误导性:%c
格式读取单个字符,而不是任何sor的字符串t、 另外,由于只有数字可以进入循环,c
不可能等于0x0A
(哪一个更好写'\n'
)在循环内部。这可能也是;如果第二次进入if
块,打印和关闭将导致灾难。您应该在fclose()之后添加break;
,或者可能是一个返回值
。另外,格式为%c
的fprintf
将需要一个char
参数,而不是char*
(假设c
是char
)。
char line[80];
if (fgets(line, sizeof line, stdin)) {
int digits = strspn(line, "0123456789");
if (digits > 0 && line[digits] == '\n') {
fprintf(f, "%.*s", digits, line); // output the digits
// handle the value read?
} else {
// handle incorrect input
}
} else {
// handle premature end of file
}
fclose(f);