不知道为什么使用scanf时while循环的工作方式不同

不知道为什么使用scanf时while循环的工作方式不同,c,C,我是学习C的新手,据我所知,如果有人给出诸如while(1==1)之类的条件,while循环将永远运行 但在阅读一本书时,我注意到一个代码,如 #include<stdio.h> int main() { char a; int started = 0; puts("Scanning\n"); while (scanf("%s[^\n]",&a) == 1) { if (a >= 65 && a

我是学习C的新手,据我所知,如果有人给出诸如
while(1==1)
之类的条件,while循环将永远运行

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

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


}
#包括
int main(){
字符a;
int=0;
放入(“扫描”\n);
而(scanf(“%s[^\n]”,&a)==1)
{
如果(a>=65&&a
char.exe

它从stdin获取输入,但scanf返回参数的数目,即1,因此当
(1==1)

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

感谢您的光临

char a;
...
while (scanf("%s[^\n]",&a) == 1)
您的格式无效,因为它专用于字符串,而您只想读取一个字符,因此您将至少为结尾的null字符写出该字符,从而产生未定义的行为

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

如果(a>=65&&a='a'&&a
但为什么这不是一个永久循环,而是在读取文件后存在

只有
scanf
每次调用时返回1,它才会无限期地循环。循环在函数第一次返回不同结果时终止*

scanf
的返回值传递成功扫描和分配的输入字段数,在某些情况下还传递有关I/O错误的信息。
scanf
将返回宏
EOF
的值,如果它在匹配任何字段之前到达输入的末尾。
EOF
不等于1



*前提是程序的行为定义良好。由于注释和另一个答案中描述的原因,您的程序的行为没有定义好。

函数scanf返回以下值:

  • >0
    成功转换和分配的项目数
  • 0-未分配任何项目


  • &a
    表示试图读取堆栈变量中的整行

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

    尝试读取堆栈变量中的文件将导致堆栈崩溃,程序将崩溃

    在internet上的C中查找不同的存储类型和内存管理。
    a
    是分配在程序堆栈上的字符变量,假设只存储一个字符。如果您获取它的地址并尝试放置更多数据,它将损坏相邻的堆栈内存/变量,直到操作系统检测到并终止您的程序。您的format表示它将读取整行,即直到新行。
    scanf
    仍将返回1,但它将尝试将该行存储在
    a
    的地址中

    您是否像这样运行它:

    cat <your file>| ./a.out
    
    注意现在
    a
    现在是一个数组,前面不需要
    &
    。当文件完成时,循环仍将退出,但处于EOF。如果新行直到4Kb才出现,最坏的情况是尝试使用小于4Kb的文件

    阅读更大文件/行的规定似乎超出了您的实验范围

    工作代码

    #include<stdio.h>
    
    int main() {
    
    char a[4096];
    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;
    }
    
    #包括
    int main(){
    chara[4096];
    int=0;
    放入(“扫描”\n);
    而(scanf(“%s[^\n]”,a)==1)
    {
    
    如果输入字母时(a>=65&&a,则条件
    (1==1)
    变为真,循环时
    的主体被迭代

    在迭代
    while
    循环之后,它将进入下一个字母。
    scanf
    等待您输入下一个字符

    再次满足条件
    (1==1)


    这个循环是一个不确定的循环,你可以继续输入字母,你永远不会到达
    puts
    语句。

    什么是
    a
    ?你应该充实发布的代码,这样它就是一个读取循环。它可以返回的不仅仅是arg count如果你将
    a
    与整数进行比较,我假定它是整数。T当向其中读取字符串时,肯定不起作用。无论是在循环内还是循环外。将
    scanf(“%s[^\n]”,&a)
    替换为
    scanf(“%c”,&a)
    (注意格式中的空格),也将65替换为“a”,将90替换为“Z”,您可以使用
    isupper()
    测试字符是否为大写,而不是使用那些神奇的数字。所有这些都是绝对正确的,但对实际提出的问题没有反应。
    if (a >= 'A' && a <= 'Z')
    
    cat <your file>| ./a.out
    
    while(scanf("%s[^\n]", a) == 1)
    
    #include<stdio.h>
    
    int main() {
    
    char a[4096];
    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;
    }