字符串拼接 strcat ;数组和指针的区别
问题:字符串拼接 strcat
方法1:
开辟新空间,存放结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h> char* _strcat(char* str1, char* str2){
assert(str1 != NULL && str2 != NULL);
char* ret = (char*)malloc((strlen(str1)+strlen(str2)+)*sizeof(char));
char* tmp = ret;
while(*str1 != '\0') *tmp++ = *str1++;
while(*str2 != '\0') *tmp++ = *str2++;
return ret;
} int main(){
char str1[] = "abc";
char str2[] = "def";
char tmp = _strcat(str1,str2);
printf("result = %s\n",tmp);
free(ret);
return ;
}
结果:
[root@admin Desktop]# ./a.out
result = abcdef
[root@admin Desktop]#
方法2:
不开辟空间,直接在str1后面追加拼接str2;
起初我代码这么写的:
void _strcat2(char* str1,char* str2){
while(*str1++ != '\0');
while((*str1++ = *str2++) != '\0');
} int main(){
char* str1 = "abc";
char* str2 = "def";
_strcat2(str1,str2);
printf("result = %s\n",str1);
return ;
}
出现段错误,后来改char* str1 = "abc";为char str1[] = "abc"后问题解决;
然后出现的问题是,输出结果是"abc"而不是"abcdef",在while(*str1++ != '\0');后添加str1--;解决。
下面讨论这两个问题:
1. char str* 和char str[]区别.
下面说二者的不同之处。如下一段代码:
char ss[]="C++";
ss[]='c'; // 合法
char *p="C++";
p[]='c'; // 合法但不正确
问题出在p[0]='c'这一语句。该语句试图修改p指向的字符串的首个字符,出现了错误。
原因在于两种方式对字符数组操作的机制不同:使用char *p="C++"语句后,编译器在内存的常量区分配一块内存,保存”C++“这一字符串字面值,然后在栈上分配内存保存p,p的内容为"C++"的地址。p[0]='c'试图修改常量”C++“,程序当然就会崩溃了。而char ss[]="C++"语句,定义了一个数组,编译器为其在栈上分配了内存空间,因而可以进行修改操作。
因此,可以总结如下:
char ss[]定义了一个数组,ss可认为是一个常指针,ss不可改变,但ss指向的内容可以发生改变。
char *p定义了一个可变指针,p可以指向其它对象。但对于char *p=”abc“这样的情况,p指向的是常量,故内容不能改变。
再看看这个:
char* strA()
{
char str[]="Hello";
return str;
}
调用该函数,不一定能够得到正确的结果。因为str定义了一个局部变量,存在于函数strA中的栈中。当函数调用完成后,临时空间被重置,为函数分配的栈空间被收回,str所指向的地址也就不存在了。
将上述代码修改为:
char *strA()
{
char *str="Hello";
return str;
}
就没有问题。
问题2:++运算符怎么用
字符串拼接 strcat ;数组和指针的区别的更多相关文章
- 数组与指针的区别,以及在STL中传递数组/指针
数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...
- (转载)C语言 数组与指针的区别
1) 字符串指针变量是个变量,指向字符串的首地址:而字符串数组名是个常量,为字符串数组第一个元素的地址: 2)字符串指针变量可以赋值,而字符串数组名不能赋值:对于字符数组只能对各个元素赋值,不能用以下 ...
- (C语言)数组与指针的区别
以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...
- C 中数组和指针的区别
联系: 1,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现. 2,当数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址. 区别: 1,指针是一个变量,因此,在C语言中,语句pa= ...
- (C/C++)区别:数组与指针,指针与引用
1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型 ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
- C/C++数组和指针详解
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- char[]数组与char *指针的区别
char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...
- 由strcat函数引发的C语言中数组和指针问题的思考
问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...
随机推荐
- 【足迹C++primer】49、超载,变化,运营商
超载,变化,运营商 Conversion Operators 转换操作符 operator type() const Conversions to an array or a function typ ...
- js 利用iframe和location.hash跨域解决的方法,java图片上传回调JS函数跨域
奶奶的:折腾了我二天,最终攻克了!网上有非常多样例. 但跟我的都不太一样,费话不多说了,上图 上代码: IE ,firefix,chrome 測试通过 js :这个主页面,部分代码, functi ...
- POJ1135_Domino Effect(最短)
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8224 Accepted: 2068 Des ...
- 透过【百度地图API】分析双闭包问题
原文:透过[百度地图API]分析双闭包问题 摘要: 有位API爱好者问到,昨天的教程里为什么不使用for循环?他使用for循环后,也发现代码无效.这是什么原因? ------------------- ...
- Webbrowser控件史上最强技巧全集
原文:Webbrowser控件史上最强技巧全集 Webbrowser控件史上最强技巧全集 VB调用webbrowser技巧集 1.获得浏览器信息: Private Sub Command1_Click ...
- unpivot,pivot,case when ,行转列,列转行 sql server
http://technet.microsoft.com/zh-cn/library/ms177410.aspx unpivot : CREATE TABLE pvt (VendorID int, E ...
- 网站静态化处理—CSI(5)
网站静态化处理—CSI(5) 讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说 ...
- 使用Scala操作Mongodb
介绍 Scala是一种功能性面向对象语言.它融汇了很多前所未有的特性.而同一时候又执行于JVM之上.随着开发人员对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件不可缺 ...
- 一个极简的守护进程Bash脚本
由于最近写的Node.js程序因为一些Bug,会出现一些自动退出的问题,所以需要在它退出的时候及时发现,并重新启动 于是查阅了些资料,写了一个Bash的程序,功能十分简单,就是每隔3s判断一次处在60 ...
- Bootstrap Paginator分页插件
Bootstrap Paginator分页插件使用示例 最近做的asp.netMVC项目中需要对数据列表进行分类,这个本来就是基于bootstrap开发的后台,因此也就想着bootstrap是否有分页 ...