字符数组的工作原理

How character array works

试试下面的代码

程序 1

#include<stdio.h>
int main()
{
    int i=2;  //two times
    while(i>0)
    {
        char ch[2];  
        scanf("%s",ch);   
        printf("%s\n",ch);
        i--;
     }
    return 0;
}

输出(循环永不终止并获取并打印任意长度的字符串)

wdefgfvcdswdfetgyhujik
wdefgfvcdswdfetgyhujik
nbvewsq
nbvewsq
hgbvfdw
hgbvfdw
hbgfvedw
hbgfvedw
gfvdcwsq
gfvdcwsq
.
.
.

输出(循环在获取有效字符串集时终止)

a
a
b
b

程序2

#include<stdio.h>
int main()
{
    char ch[2]; 
    scanf("%s",ch);   
    printf("%s\n",ch);

    return 0;
}

输出(它如何打印并说分段错误)

sxdfvghujiuytredwsazxacdfv
sxdfvghujiuytredwsazxacdfv
Segmentation fault

关于第一个问题:

如果你要调试程序,你可以很容易地看到无限循环是因为你覆盖了 i 而没有正确使用 scanf,第二个问题的修复应该修复它.

关于第二个问题:

您正在使用 scanf 函数,这是不安全的,因为无论您分配的缓冲区大小如何,它都会从用户读取整个输入(在您的情况下 char ch[2] .

所以尽管它确实将整个字符串 sxdfvghujiuytredwsazxacdfv 输入到 ch 但显然是溢出了 -> 因此分段错误是不可避免的。 而是使用 scanf_s 并限制要读取的字符数。

注:

如果你提出警告标志,它应该看起来 scanf 有问题且不安全