Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf()输入字符串_C_Arrays_Scanf - Fatal编程技术网

使用scanf()输入字符串

使用scanf()输入字符串,c,arrays,scanf,C,Arrays,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; } #包括 内部主(空) { chars1[5]; printf(“输入文本:\n”); scanf(“%s”,s1); pr

我开始学习用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;

}
#包括
内部主(空)
{
chars1[5];
printf(“输入文本:\n”);
scanf(“%s”,s1);
printf(“\n%s\n”,s1);
返回0;
}
当输入为:

  • 123456789234567
    ,我已经检查了它最多16个元素(我不理解,因为它超过5个元素)
  • 1234567892345678
    ,它给了我一个错误
    分段错误:11
    (我在本例中给出了17个元素)
  • 123456789123456789
    ,错误是
    非法指令:4
    (本例中我给出了18个元素)
  • 我不明白为什么会有不同的错误。这是C中的
    scanf()
    或字符数组的行为吗?。我正在读的那本书对这些事情没有一个清楚的解释。仅供参考,我对指针一无所知。对此的任何进一步解释都会非常有用

    这是C中scanf()或字符数组的行为吗

    TL;医生-不,你面临的是药物的副作用

    在您的情况下,针对以下代码进行详细说明:

     scanf("%s",s1);
    
    你定义了什么

     char s1[5];
    
    输入任何超过4
    char
    的内容都会导致程序进入无效内存区域(超过分配的内存),而无效内存区域反过来会调用

    一旦你点击UB,程序的行为就无法预测或以任何方式证明。它可以做任何可能(甚至不可能)的事情

    scanf()
    中没有任何固有的内容会阻止您读取过长的输入并溢出缓冲区,您应该通过使用字段宽度来控制输入字符串扫描,如

     scanf("%4s",s1);  //1 saved for terminating null
    
    这是C中scanf()或字符数组的行为吗

    TL;医生-不,你面临的是药物的副作用

    在您的情况下,针对以下代码进行详细说明:

     scanf("%s",s1);
    
    你定义了什么

     char s1[5];
    
    输入任何超过4
    char
    的内容都会导致程序进入无效内存区域(超过分配的内存),而无效内存区域反过来会调用

    一旦你点击UB,程序的行为就无法预测或以任何方式证明。它可以做任何可能(甚至不可能)的事情

    scanf()
    中没有任何固有的内容会阻止您读取过长的输入并溢出缓冲区,您应该通过使用字段宽度来控制输入字符串扫描,如

     scanf("%4s",s1);  //1 saved for terminating null
    

    scanf
    在读取读取到下一个空格(例如换行符、空格、制表符等)或“文件结尾”的字符串时起作用。它不知道您提供给它的缓冲区的大小

    如果您读取的字符串比提供的缓冲区长,那么它将写越界,并且您将有未定义的行为

    停止此操作的最简单方法是为
    scanf
    格式提供字段长度,如中所示

    char s1[5];
    scanf("%4s",s1);
    
    注意,我使用
    4
    作为字段长度,因为字符串终止符也需要有空间

    您还可以使用需要提供缓冲区大小作为参数的“安全”:

    char s1[5];
    scanf_s("%s", s1, sizeof(s1));
    

    scanf
    在读取读取到下一个空格(例如换行符、空格、制表符等)或“文件结尾”的字符串时起作用。它不知道您提供给它的缓冲区的大小

    如果您读取的字符串比提供的缓冲区长,那么它将写越界,并且您将有未定义的行为

    停止此操作的最简单方法是为
    scanf
    格式提供字段长度,如中所示

    char s1[5];
    scanf("%4s",s1);
    
    注意,我使用
    4
    作为字段长度,因为字符串终止符也需要有空间

    您还可以使用需要提供缓冲区大小作为参数的“安全”:

    char s1[5];
    scanf_s("%s", s1, sizeof(s1));
    

    当输入长度超过4个字符时,行为未定义。未定义的行为并不意味着“必须立即崩溃”,它意味着语言没有义务做任何特别的事情。但当输入长度超过5个字符时,它不应该给我一个错误吗?@buggenerator:这不是违反约束,编译器没有义务发出诊断消息,也不要求在运行时引发错误。@buggenerator如果您想在出错时立即收到错误消息,则需要了解C语言不适合您。C代表有效性,编译器添加最小控件以确保生成最有效的程序。当输入长度超过4个字符时,行为是未定义的。未定义的行为并不意味着“必须立即崩溃”,它意味着语言没有义务做任何特别的事情。但当输入长度超过5个字符时,它不应该给我一个错误吗?@buggenerator:这不是违反约束,编译器没有义务发出诊断消息,也不要求在运行时引发错误。@buggenerator如果您想在出错时立即收到错误消息,则需要了解C语言不适合您。C是为了提高效率,编译器添加了最少的控件,以确保它能生成最有效的程序。这是否意味着在本例中缓冲区为16个字符?@buggenerator否缓冲区的长度是您声明变量时提供的长度。所以这里的长度是5。(char s1[5])@bugggenerator“buffer size”是您声明的数组的大小(可能为终止符减去1)。我在这里不是天真的。这是否意味着在本例中缓冲区为16个字符?@buggenerator否缓冲区的长度是您声明变量时提供的长度。所以这里的长度是5。(char s1[5])@bugggenerator“buffer size”是您声明的数组的大小(对于