strcat()函数的大小定义 [英] Size definition of strcat() function

查看:31
本文介绍了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[] = "computerprogram";
// array: { 'c', 'o', ... '', 'p', 'r', 'o', .., 'm', '' }

// ...
printf("%s
", buffer1);

将仅打印computer。但此时缓冲区将足够大,可以容纳计算机和程序、一个终止符(以及另一个额外的字节),因为编译器计算字符数组的大小时考虑了语法上以第二个"结束的字符的文字序列。

但对于所有C字符串函数,buffer1中包含的字符串是computer。另请注意,sizeof buffer1将给出正确的缓冲区大小,即17,而strlen(buffer1)的结果仅为8。

这篇关于strcat()函数的大小定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆