我正在尝试将用户输入的字符串打印到文件(作为字符),并在到达用户输入结束时停止打印。当我运行代码时,似乎创建了一个无限循环,并且在文件中打印了大量的pd_inv()
。我不知道出了什么问题。
以下是代码:
▯
以下是输出文件的图像:File1.txt
答案 0 :(得分:1)
首先,学习如何以可靠,简单的方式读取字符串。在阅读字符串并学习使用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);
我没有添加任何错误检查。您需要确保fgets
实际上至少成功。
答案 1 :(得分:1)
你有一个无限循环因为你没有修改c
循环中的while
变量,所以条件总是计算为相同的值...
此外,您不打印字符:您传递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);
}
但请注意,如果未读取换行符,则不会存储读取的字符,也不会fclose()
该文件。你的逻辑似乎破碎了。使用fgets()
读取整行并扫描输入以进行验证和进一步处理会更简单。
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);