首页 > 解决方案 > 不知道为什么使用 scanf 时 while 循环的工作方式不同

问题描述

我是学习 C 的新手,据我所知,我知道如果有人给出条件,while 循环将永远运行,例如while (1 == 1)它将成为一个永远循环。

但是在阅读一本书时,我注意到了一个代码,例如

#include<stdio.h>

int main() {

    char a;
    int started = 0;
    puts("Scanning\n");
    while (scanf("%s[^\n]",&a) == 1)
    {
        if (a >= 65 && a <= 90)
        {
            printf("Char is capital\n");
        }
        else
        {
            printf("Not cap.\n");
        }

    }
    puts("Done\n");
    return 0;


}

命令行 =>char.exe < file.txt

它从 stdin 获取输入,但 scanf 返回参数的数量,即 1,因此条件应变为 while(1 == 1)

但是为什么这不是一个永久循环并且在读取文件后存在?

谢谢

标签: c

解决方案


char a;
...
while (scanf("%s[^\n]",&a) == 1)

您的格式无效,因为专用于字符串,而您只想读取一个字符,因此您将至少为结尾的空字符写出字符,从而产生未定义的行为

char a;
...
while (scanf(" %c",&a) == 1)

并注意格式中的空格,如果要管理所有字符,请将其删除

 if (a >= 65 && a <= 90)

使用 ASCII 码是错误的,这不可读且与非 ASCII 不兼容

你可以做

if (a >= 'A' && a <= 'Z')

或更好地使用isupper ( <ctype.h>) 因为它不是保证,而不是大写字母是连续的

您的printf可以替换为puts删除字符串中的 \n 或fputs,让printf打印一个简单的字符串(没有 % 和 arg)是没有用的

但是为什么这不是一个永久循环并且在读取文件后存在?

scanf在 EOF 上不返回 1,因此循环在 EOF 上停止,关于scanf系列:

这些函数返回成功匹配和分配的输入项的数量,该数量可能少于提供的数量,或者在早期匹配失败的情况下甚至为零。

如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值 EOF。如果发生读取错误,也会返回 EOF,在这种情况下会设置流的错误指示符(请参阅 ferror(3)),并设置 errno 来指示错误。


推荐阅读