问题:字符串拼接 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:++运算符怎么用

在while(*str1++ != '\0');这句,我们看看执行过程:
1.先判断 *str1 != '\0' 然后 str1++;
2.执行到最后一个的时候 *str1 == '\0'时, 还会执行一次 str1++;
3.所以最后str1指向的是'\0'之后的位置;
 
所以错误出在已经跳过str1最后的'\0'了,导致拼接以后结果是"a b c \0 d e f \0";
当printf到c时遇到‘\0‘停止输出。

字符串拼接 strcat ;数组和指针的区别的更多相关文章

  1. 数组与指针的区别,以及在STL中传递数组/指针

    数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...

  2. (转载)C语言 数组与指针的区别

    1) 字符串指针变量是个变量,指向字符串的首地址:而字符串数组名是个常量,为字符串数组第一个元素的地址: 2)字符串指针变量可以赋值,而字符串数组名不能赋值:对于字符数组只能对各个元素赋值,不能用以下 ...

  3. (C语言)数组与指针的区别

    以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...

  4. C 中数组和指针的区别

    联系: 1,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现. 2,当数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址. 区别: 1,指针是一个变量,因此,在C语言中,语句pa= ...

  5. (C/C++)区别:数组与指针,指针与引用

    1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型 ...

  6. C语言学习004:数组与指针

    在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的

  7. C/C++数组和指针详解

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  8. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  9. 由strcat函数引发的C语言中数组和指针问题的思考

    问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...

随机推荐

  1. java界面编程(8) ------ 组合框(下拉列表)

    本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 与一组单选button的功能类似,组合框(下拉列表)也是强制用户从一组可能的元素 ...

  2. linux中如何用root去修改其他用户的密码

    linux中如何用root去修改其他用户的密码 昨天linux实验课,我有很多自己想摸索的东西.今天周五,本是下午一二节是编译的实验,可强烈的欲望让我今早就来实验室了,摸索吧,碰到了这个问题....  ...

  3. 代理模式与Android

    代理模式(Proxy) 一.   什么是代理模式 先来看看官方的说法,代理模式就是为其它对象提供一种代理,以控制对这个对象的訪问. 看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不 ...

  4. Emojicon - 为你提供emoji表情的整套方案

    Github : https://github.com/rockerhieu/emojicon 事实上国内的<表情大全>也有提供类似整套表情解决方式,并且还支持gif表情:http://w ...

  5. [LeetCode]Copy List with Random Pointer &amp;Clone Graph 复杂链表的复制&amp;图的复制

    /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label ...

  6. Swift编程语言学习4.1——周期

    Swift它提供了类似 C 流量控制结构语言,它包含运行多个任务的能力for和while周期.选择根据不同的编码分支机构的具体条件来运行if和switch声明,有控制流程跳转到其他代码break和co ...

  7. JS自动化测试 单元测试之Qunit

    前言 因为公司开发了一套javascript SDK需要测试,在网上找了很久,找到了JQuery团队开发的QUnit,和基于JUnit的JsUnit,还有一些还没有看,先讲讲QUnit吧 下载 登录J ...

  8. jquery validate remote验证唯一性

    jquery.validate.js 的 remote 后台验证 之前已经有一篇关于jquery.validate.js验证的文章,还不太理解的可以先看看:jQuery Validate 表单验证(这 ...

  9. CSS知识点:清除浮动

    开场白 我们平时工作中,很容易遇到浮动效果.一个DIV中嵌套多个DIV,左边显示一个DIV,右边显示一个DIV,外层DIV的高度随着内层内容的高度变化.这就是最基本的浮动效果.下图的百度搜索结果就是一 ...

  10. 日志分析工具-ApexSQL介绍

    原文:日志分析工具-ApexSQL介绍 使用场景:业务数据异常变化,通过代码分析不出来的时候,迫不得已需要通过日志来分析 下载地址:http://www.apexsql.com/Download.as ...