[英]inputting a character string using scanf()
我开始学习有关在C语言中输入字符串的信息。在以下源代码中,我得到了一个长度为5的字符数组。
#include<stdio.h>
int main(void)
{
char s1[5];
printf("enter text:\n");
scanf("%s",s1);
printf("\n%s\n",s1);
return 0;
}
当输入为:
1234567891234567
,并且我检查了它最多可以正常工作16个元素(我不明白,因为它超过5个元素)。 12345678912345678
,这给了我一个错误segmentation fault: 11
(在这种情况下,我给出了17个元素) 123456789123456789
,错误是Illegal instruction: 4
(在这种情况下,我给出了18个元素) 我不明白为什么会有不同的错误。 这是scanf()
还是C中的字符数组的行为? 我正在阅读的书对此没有明确的解释。 仅供参考,我对指针一无所知。 关于此的任何进一步解释将非常有帮助。
这是scanf()还是C中字符数组的行为?
TL; DR-不,您正面临不确定行为的副作用。
在您的情况下,针对类似
scanf("%s",s1);
您定义的位置
char s1[5];
输入超过4个char
任何内容将使您的程序进入无效的内存区域(过去分配的内存),从而调用未定义的行为 。
一旦打到UB,就无法以任何方式预测或证明程序的行为。 它可以做任何可能的事情(甚至是不可能的事情)。
scanf()
没有内在的本质,它可以阻止您读取过长的输入并溢出缓冲区,您应该使用字段宽度来控制输入字符串的扫描,例如
scanf("%4s",s1); //1 saved for terminating null
读取字符串时, scanf
函数将读取下一个空格(例如,换行符,空格,制表符等)或“文件结尾”。 它不知道您提供的缓冲区的大小。
如果您读取的字符串比提供的缓冲区长,那么它将超出范围,并且您将具有undefined behavior 。
停止此操作的最简单方法是为scanf
格式提供字段长度,如
char s1[5];
scanf("%4s",s1);
请注意,我使用4
作为字段长度,因为字符串终止符也需要有空间。
您还可以使用需要提供缓冲区大小的“安全” scanf_s
作为参数:
char s1[5];
scanf_s("%s", s1, sizeof(s1));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.