问题:字符串拼接 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. Tsql查询执行顺序

    对于T-SQL编程,用得最广泛的,莫过于查询(Querying).要想写出高质量.高性能的查询语句,必须深入地了解逻辑查询处理. 一.逻辑查询处理的各个阶段 (5)SELECT DISTINCT TO ...

  2. 朴素UNIX之-打开历史

    它可以毫不夸张地说,,UNIX模型是现代操作系统的原型.无论是真实的UNIX让我们大系列AIX,Solaris,HP-UX,FreeBSD,NetBSD,...或类别UNIX实例Linux...或基于 ...

  3. word 一些有用的技巧

    为了能够word入代码,而且具备代码高亮显示功能.这里我提供一个工具------Notepad++,它具备一般文本的功能,且具备编写代码的功能. 包含代码排版,高亮显示,加入和删除凝视等.  在  语 ...

  4. Web文件(图片)上传方法

    在开放Web应用程序的时候经常会遇到图片或者是文件上传的模块,这里就是该模块的实现的后台方法 上传图片方法 /// <summary> /// 功能:上传图片方法 /// </sum ...

  5. Linux基础正则表达式:grep,sed

    先说明语系对正则表达式的影响    LANG=C:0,1,2,3,4...A,B,C,D...Z a b c d ... z    LANG=zh_CN:0,1,2,3,4...a A b B c C ...

  6. Java泛型解析(03):虚拟机运行泛型代码

    Java泛型解析(03):虚拟机运行泛型代码      Java虚拟机是不存在泛型类型对象的,全部的对象都属于普通类,甚至在泛型实现的早起版本号中,可以将使用泛型的程序编译为在1.0虚拟机上可以执行的 ...

  7. git合并远端分支到本地分支的两种方式

    作者:zhanhailiang 日期:2014-11-21 在使用版本号工具提交改动之前,都须要通过update先将本地代码更新到最新版本号.SVN通过svn update就能够实现,那么git怎样实 ...

  8. Unofficial Microsoft SQL Server Driver for PHP (sqlsrv)非官方的PHP SQL Server 驱动

    原文 Unofficial Microsoft SQL Server Driver for PHP (sqlsrv) Here are unofficial modified builds of Mi ...

  9. Eclipse生成jsp 如何将GB18030 改成默认UTF-8

    前两天面试被问到了struts的问题,好久没用了准备复习下,用eclipse创建一个maven项目的时候发现创建的jsp文件都是GB18030编码的,如何更改为UTF-8呢,其实很简单,给各位分享一下 ...

  10. 客户端Webview重定向

    今天在客户端的网页中写了句alert的代码,发现执行了两次,后来发现网页的地址写的是http://192.168.14.72/app 客户端Webview加载网页,对于不完全路径会重定向到完全路径,导 ...