使用fprintf引起的无限循环

时间:2016-11-20 21:59:29

标签: c

我正在尝试将用户输入的字符串打印到文件(作为字符),并在到达用户输入结束时停止打印。当我运行代码时,似乎创建了一个无限循环,并且在文件中打印了大量的pd_inv()。我不知道出了什么问题。

以下是代码:

以下是输出文件的图像:File1.txt

2 个答案:

答案 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);