重新复习C语言遇到的一个神奇的问题

C语言 码拜 9年前 (2016-05-04) 893次浏览
   有下面一段C程序:
char st[15];
printf(“Input string to test the function gets and puts:\n”);
gets(st);//不以空格作为字符串输入结束的标志
puts(st);
printf(“The length of st: %d\n”,sizeof(st));
printf(“The length of st: %d\n”,strlen(st));
运行后,输入abcdefghijklmnopqrstuvwxyz,输出
    The length of st: 15
The length of st: 26

哪位高手来给解释下,还有就是定义的字符数组st是15长度的,但实际输入的字符串明显超过了15,但st仍然可以接受,这又怎么样解释?
解决方案

10

strlen只能用char*做参数,且必须是以””\0″”结尾的,strlen的结果要在运行的时候才能计算出来字符串的长度。
大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来计算字符数组长度的原因
有的编译器把内存的大小放在了数组首地址前的空间里。

5

引用

定义的字符数组st是15长度的,但实际输入的字符串明显超过了15

未定义行为
未定义行为可能产生任何结果,包括但不限于:产生期望的结果,产生未期望的结果,产生随机的结果,产生无法解释的结果,运行错误,随机的运行时错误,编译错误,等等

20

题主还没有明白sizeof和strlen的区别吧
sizeof是用来计算某个类型的变量的长度的,它一定是对应一种类型的,你这里的类型就是char[15],虽然C语言里没把这个东西看做一种类型,但理解上可以这么理解,即st是一个类型为char[15]的变量,所占的内存空间大小就是15个字节,以后你遇到sizeof直接去找对应的类型就可以了
strlen是一个函数,是专门用来求字符数组(只能是字符数组)长度的,它的原理也很简单,就是遇到”\0″,就会停止计数(不包括”\0″),它不会管你是什么类型的,它只知道去找\0″
你的输入显然是超出了预先分配的空间大小,发生了缓冲器溢出错误,但并没有造成严重后果,你可以试试再多输入一些,肯定是有问题的,这也是gets这类函数的最大缺点

10

strlen是字符串的大小(字符串大小,C中字符串是以\0结尾
sizeof是字符数组的大小(数组大小

5

3L说得很对啊, 有溢出的.是该复习一下了.

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明重新复习C语言遇到的一个神奇的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)