关于VC++6.0中的字符串拼接函数strcat

来源:互联网 发布:毕向东java反射 编辑:程序博客网 时间:2024/05/02 00:29

原型:extern char *strcat(char *dest,char *src);
头文件:#include <string>

功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串,返回指向dest的指针。

 

举例说明:

[cpp] view plaincopyprint?
  1. #include<stdio.h>  
  2. #include<string>  
  3. int main()  
  4. {  
  5.  printf("hello,world");  
  6.  char* command = (char*)malloc(150*sizeof(char));  //分配空间  
  7.   
  8.     command = strcat(command,"mp4info ");   
  9.     command = strcat(command,"Alice.mp4 ");  
  10.     command = strcat(command," >temp");  
  11.     puts(command);           //将command显示在控制台窗口  
  12.     system(command);         //执行command中的命令  
  13.  return 0;  
  14. }  

说明:上述代码中的mp4info为一个控制台应用程序,用于解析mp4文件的信息,并将信息输出到temp中。

问题描述:上述代码在编译连接时没有报错,但是运行时出现下面的错误

上述代码表面上看没有错误,但其中隐含有系统默认的错误或者程序员在编写代码时没有养成良好的习惯而形成的错误,从输出的那一长串屯屯屯屯..........”来看,应该是系统为command分配的空间中填入了一些默认值,而strcat函数的功能实际上是从command数组第0位开始依次查找直到找到第一个'\0'字符,然后将src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。而最后的内存不能为读错误,应该是command越界了。

下面的代码可以验证:

[cpp] view plaincopyprint?
  1. #include<stdio.h>  
  2. #include<string>  
  3.   
  4. int main()  
  5. {  
  6.     printf("hello,world \n");  
  7.     char* command = (char*)malloc(150*sizeof(char));  //分配空间  
  8.   
  9.     printf("command[0] = %c \n",command[0]);  
  10.     return 0;  
  11. }  

下图为输出结果

从上面的代码中可以看到系统为command[0]默认分配了字符'?'

为了修正上面的问题,其实解决方法很简单,就是为刚分配的空间字符做清零初始化。

代码如下:

[cpp] view plaincopyprint?
  1. #include<stdio.h>  
  2. #include<string>  
  3.   
  4.   
  5. int main()  
  6. {  
  7.     printf("hello,world \n");  
  8.     char* command = (char*)malloc(150*sizeof(char));  //分配空间  
  9.   
  10.     memset(command,0,150*sizeof(char));   //初始化  
  11.   
  12.           command = strcat(command,"mp4info ");        
  13.           command = strcat(command,"Alice.mp4 ");  
  14.           command = strcat(command," >temp");  
  15.           puts(command);           //将command显示在控制台窗口  
  16.           system(command);         //执行command中的命令  
  17.     return 0;  
  18. }  
下面为正确输出结果:

开发笔记:

1.在编写程序时应该养成良好的习惯,比如本文中的在使用每一个自定义变量前一定要为其赋予初始值,这样可以避免很多隐性的错误。

 

http://blog.csdn.net/c_m_deng/article/details/8048211

0 0
原创粉丝点击