strcat()函数的大小定义 [英] Size definition of strcat() function
本文介绍了strcat()函数的大小定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
string[]
应该是string[some-number]
)
当程序如下所示时,它会给我Abort trap: 6
:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buffer1[] = "computer";
char string[]="program";
strcat( buffer1, string );
printf( "buffer1 = %s
", buffer1 );
}
这是http://www.tutorialspoint.com/cprogramming/c_data_types.htm中的程序,运行正常:
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[12] = "Hello";
char str2[12] = "World";
char str3[12];
int len ;
/* copy str1 into str3 */
strcpy(str3, str1);
printf("strcpy( str3, str1) : %s
", str3 );
/* concatenates str1 and str2 */
strcat( str1, str2);
printf("strcat( str1, str2): %s
", str1 );
/* total lenghth of str1 after concatenation */
len = strlen(str1);
printf("strlen(str1) : %d
", len );
return 0;
}
错误在哪里?即使我在程序中定义了所有字符串的大小,我的代码仍然给出Abort trap:6
?
推荐答案
您的strcat
缓冲区溢出buffer1
,它只能容纳strlen("computer")+1
个字节。省略数组大小并不意味着"动态"数组!当您指定数组的大小时,您想保留多少字节就保留多少字节:当然,您还需要避免缓冲区溢出。
所以,
strcpy(str3, str1);
和
strcat( str1, str2);
可以,因为str3
大小对于str1
就足够了,str1
对于strlen(str1) + strlen(str2) + 1
就足够了,即正好11:5(Hello)+5(World)+1(终止符)。选择魔术数字12是有原因的,大到足以容纳字符串和终结符。
关于C字符串
C字符串是最后一个为"null"的字符数组,' '
,即它们是最后一个为0的字符数组。需要此终止符,以便与字符串相关的函数可以了解字符串的结束位置。
如果恰好在字符串中间发现空字节,从C字符串函数的角度来看,字符串将在该点结束。例如
char buffer1[] = "computer program";
// array: { 'c', 'o', ... ' ', 'p', 'r', 'o', .., 'm', ' ' }
// ...
printf("%s
", buffer1);
将仅打印computer
。但此时缓冲区将足够大,可以容纳计算机和程序、一个终止符(以及另一个额外的字节),因为编译器计算字符数组的大小时考虑了语法上以第二个"
结束的字符的文字序列。
但对于所有C字符串函数,buffer1
中包含的字符串是computer
。另请注意,sizeof buffer1
将给出正确的缓冲区大小,即17,而strlen(buffer1)
的结果仅为8。
这篇关于strcat()函数的大小定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文