繁体   English   中英

使用scanf()输入字符串

[英]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;

}

当输入为:

  1. 1234567891234567 ,并且我检查了它最多可以正常工作16个元素(我不明白,因为它超过5个元素)。
  2. 12345678912345678 ,这给了我一个错误segmentation fault: 11 (在这种情况下,我给出了17个元素)
  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM