字符数组的工作原理
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
有问题且不安全
试试下面的代码
程序 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
有问题且不安全