首页 > 试题广场 >

指出下面代码有什么问题?

[问答题]
指出下面代码有什么问题?
void test3(char* str1) 
{ 
 if(str1 == NULL){
        return ;
 }
 char string[10]; 
 if( strlen( str1 ) <= 10 ) 
 { 
 strcpy( string, str1 ); 
 } 
} 
推荐
if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。  
编辑于 2015-12-11 10:47:06 回复(1)
知识点:
  • strlen(p)—— c风格字符串函数,返回p的长度,但不计\0在内。
  • strcpy是从源地址开始拷贝,直到遇到\0为止。
存在问题:
  • 要将str1拷贝到string,string为10,str1长度最多为10,而strlen不计\0,所以str1长度最多为9,不能等于10。
解决问题:
  • if( strlen( str1 ) <= 10 )应改为<10。
发表于 2017-05-02 10:08:36 回复(1)
1.考察strlen(str)和sizeof(str)的区别:
strlen(str):统计字符串字符个数,不包含字符串默认结束符号\0;
sizeof(str):统计字符串所占字节数,包含字符串默认结束符号\0;
2.char *strcpy(char* dest, const char *src);
从原地址开始拷贝,直到遇到\0停止,题中,假如strlen(str)=10;
其占11个字节,而string只有10 个字节可用,这样拷贝会导致数组越界;
发表于 2018-04-17 19:25:32 回复(0)
if( strlen( str1 ) <= 10 )如果等号成立的话就相当于string没有存储结束符'\0'的位置了,发生数组越界

发表于 2017-05-09 20:53:20 回复(0)
strlen计算起始地址为str1的字符串的长度时,是不把‘\0’计算进去的,因此,可以假设,str1代表的字符串恰好有10个字符,那它的第11个字符必然为‘\0’,这样的话,能满足题目中的条件了,但接下来,strcpy就会把这10个字符全部复制到string当中,但是,string最多只能容纳10个字符,这样一来,本应跟在string字符串后的‘\0’就没地方添加了,从而造成意想不到的错误。
编辑于 2016-12-19 14:34:23 回复(0)
注意sizeof和strlen的区别,前者是包含换行符后者不包括换行符,所以要小于10,就一个字节的余量。
发表于 2017-06-30 15:47:14 回复(1)
为什么没看见一个人提出将10改为11???
发表于 2017-05-25 23:13:56 回复(0)
是否应该判断*str 1== 0
发表于 2016-02-29 22:44:53 回复(1)
1.考查strlen(str)和sizeof(str)的区别:
strlen(str):统计字符串字符个数,不包含字符串默认结束符号\0;
sizeof(str):统计字符串所占字节数,包含字符串默认结束符号\0;
2.char *strcpy(char* dest, const char *src);
从原地址开始拷贝,直到遇到\0停止,题中,假如strlen(str)=10;
其占11个字节,而string只有10 个字节可用,这样拷贝会导致数组越界;
3.  对于传参char* str1而言,若str1为未初始化的局部变量,则其内容是不确定的,显示出什么的可能性都有,如果刚好栈空间都没有一个\0程序直接崩溃也是可能的,strlen遇到 \0才停止计数,没有初始化的数组指向内存中一块随机的地址,从这个地址开始,无法确定多久遇到\0。

发表于 2021-04-06 22:51:33 回复(0)
sizeof(str1)难道不是返回指针的长度?永远等于4吗,和‘\0’有什么关系?求解答?
发表于 2020-09-08 20:45:29 回复(0)
看着讨论胡说八道,我好难受啊,你们先试试再出来发啊

sizeof,如果里面的参数是char str【10】,sizeof(str) = 10;但里面的是char* str1 = str,sizeof(str1) = 4,就只是指针的大小了,所以这个题里面,如果用sizeof得到的只有4;

再者,strlen只有遇到‘\0’才会停止计数,也就是说,具体情况strlen还得看char* 中放的内容

发表于 2020-09-03 10:56:33 回复(0)
本题考查sizeof和strlen的区别以及strcpy的实现
简单来讲,sizeof会比strlen得出的值大1
sizeof:看名字就知道求的是字符串实际占用空间,包括'\0'
strlen:当然这个就是求字符串的长度,不包括'\0'
strcpy的实现:
char* strcpy(char* dst,const char* src){
    assert(dst!=NULL&&src!=NULL);
    char* ret=dst;
    while((*dst++=*src++)!='\0');
    return ret;
}
可以看到复制的时候是先赋值在在判断,也就是说src的'\0'会被赋值到dst中,所以导致dst越界。
另外这里需要注意,不管是*dst++还是*(dst++)都是先取值,然后指针再向右移动,这是指针的一个知识了。
发表于 2020-04-17 14:50:43 回复(0)
strlen是函数,运算时计算,不包含结束符\0. sizeof是运算符,其值在编译时就算好了,值是该字符串所占空间大小,包含\0.
发表于 2018-01-22 08:53:41 回复(0)
  • strlen c风格字符串函数,返回p的长度,但不计\0在内。
  • strcpy是从源地址开始拷贝,直到遇到\0为止。

发表于 2017-08-31 18:05:27 回复(0)
改为小于等于9
发表于 2015-11-23 00:00:23 回复(0)
sizeof()会统计最后的\0,而strlen不会
发表于 2016-05-24 14:16:23 回复(0)
错误有二:
  1. if (str1 == NULL) 中 由于 char* str1,所以 str1 == NULL 只能判断 str1 是否指向有效内存地址,并不能判断是否指向的字符串为空;
  2. strcpy( string, str1 ); 有缓冲区溢出的风向。可以使用strncpy(string, str1, 9); 指定复制的字节数或者 if( strlen( str1 ) < 10 ) ;string[9] = '\0':;限制复制数量,并标记结束符。  
编辑于 2024-10-21 00:03:39 回复(0)
strlen(str1) 的大小是str1不包括\0的长度,如果strlen(str1) <=10的话,会将str1最后面的\0拷贝到string所分配空间的外面,导致数组越界,故应修改成: strlen(str1) <10即可。
发表于 2021-03-24 23:39:43 回复(0)
1&7头像 1&7
sizeof()会统计最后的\0,而strlen不会
发表于 2021-03-22 01:12:11 回复(0)
<p>string末位要为0。</p>
发表于 2021-01-15 00:54:35 回复(0)
<p>每个字符串数组结尾都以’’\0’’结束</p><p>例:</p><p>char a[6]=“hello”;</p><p>char b[6]={‘h’,’e’,’l’,’l’,’o’,’\0’};</p><p>char c[6]={‘h’,’e’,’l’,’l’,’o’};</p><p>其中a[5]和b[5]自动被赋值为”\0”.</p>
发表于 2020-09-20 13:24:58 回复(0)