Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fprintf引起的无限循环_C - Fatal编程技术网

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