在研究strcat函数实现的时候,发现了while(*p++ !=‘\0’)的大秘密,也让我发现了在上篇博客中我犯的一个错误。原以为跳出后,P指向'\0',而实际上并非如此!我按跳出后P指向'\0',结果怎么拼接都实现不了,NND。为了验证这个问题,我们先上个小程序吧:
#include<stdio.h>
void main()
{
char *p = "abcdefg";
while(*p++ != 'c');
printf("%c\n", *p);
}
您猜打印出来的是几? 结果是d。
为什么呢?
原来*和++的优先级是一样的,当优先级一样的时候,程序按自左至右的顺序执行。所以当*p = 'c' 或者*p = '\0'时,p仍然要往下移一位,即p指向满足条件后的下一个字节。
由于'\0' 结束符,if 、while当会把他判成0,因此程序写成while(*p++ );效果也一样,最终程序指向字符串结束符'\0'的下一字节。
如果这样写:
while(*p)
p++;
当*p='\0'时,进不到while里面的循环,因此这种写法跳出循环的时候,p指向的是'\0'。同志们注意了,这样写while后面是没有“;”号的,文章一开始的写法后面是有“;”号的。
所以明白了这,我们写strcat就好些了,首先查找目的字符串dst的末尾处,然后复制过去就OK了。
#include <stdio.h>
#include <assert.h>
char *strcat(char *dst, const char *src)
{
assert(dst);
char *dstFirst = dst;
while(*dst++);
dst--;
while(*dst++ = *src++);
return dstFirst;
}
//测试部分
void main()
{
char *str1 = "you must";
char *str2 = "zijuezizhi!";
char *dst = malloc(100);
strcat(strcat(dst, str1), str2);
prinf("%s\n", dst);
free(dst);
dst = NULL;
这个为什么大家指点
}
测试结果:you mustzijuezizhi! 一切正常。
char *dst = malloc(100); 这句话也可以这样写:char *dst = NULL; dst = (char *)malloc(100);在程序结束处一定要free(dst)啊!也有书上说在dst调用strcat之前,要*dst = '\0',我没这样,测试结果也正确。水平有限,有些问题解释不了,大神看到了指点一二。
这里交代下为甚strcat包括strcpy函数要返回char*类型,通过程序也看到了,返回的是首地址。我们printf打印一个字符串用的参数 就是首地址。因此通过返回首地址可以实现像strcat(strcat(dst, str1), str2);这种链式调用。在某些场合很方便。
分享到:
相关推荐
代码功能是把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0′)并添加’\0′ 代码如下:char* strcat(char* strDest, const char* ... 您可能感兴趣的文章:c++ 连接两个字符串实现代码 实现类似strcat功能c++实现s
C语言字符串函数大全C/C++基础 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) ...
下面是用C语言实现不使用是strcat 函数实现连接两个字符串的功能。 源代码: #include void constring(char s[],char t[],char q[]); //函数声明 int main(void) { char s[100]; char q[100]; char t[200]; ...
C语言学习-字符串处理函数 strcat(char str1,char str2) strcpy(char str1,char str2) strncpy(char str1,char str2,int n) strcmp(char str1,char str2)//比较两个字符串大小str1>str2返回值>0,str1=str2...
该程序是我写的博客“一起talk C栗子吧(第六十一回:C语言实例--字符串连接)”的配套程序,共享给大家使用
1. strlen(),计算字符串长度 int strlen(const char string) { int i=0; while(string[i]) i++; return i; } 2. strcpy(), 字符串拷贝. char *strcpy(char *destination, const char *source) { while...
(1)不调用C++/C 的字符串库函数,请编写函数 strcat 答: VC源码: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ...
int i=0;int j=0; while(s1[i]!=’\0′)i++; while((s1[i]=s2[j])!=’\0′){ j++;i++; } cout<<s1<<endl; return 0; } 方法二 代码如下: #include “stdafx.h” #include<iostr
函数名: strcat 功 能: 字符串拼接函数 用 法: char *strcat(char *destin, char *source); 函数名: strchr 功 能: 在一个串中查找给定字符的第一个匹配之处\ 用 法: char *strchr(char *str, char c); 函数...
函数实现: 代码如下:/********************** * C语言标准库函数strcpy的一种典型的工业级的最简实现 * 返回值:目标串的地址。 * 对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通
#include #include void main() { char *a="My name is ",*b; puts(a); gets(b); strcat(a,b); puts(a); }
//strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char *strSrc) { char *res=strDest; assert((strDest!=NULL)&&(strSrc!=NULL)); ...
功 能: 字符串拼接函数,注意,destin要有足够大的空间 用 法: char *strcat(char *destin, char *source); 函数名: strchr 功 能: 在一个串中查找给定字符的第一个匹配之处,找不到返回NULL 用 法: char *strchr...
strcat(p_d,c); } delete [] p; p=p_d; cout<<"Total:"<<l<<"characters sdded:"<<c; cout<<"Dynamic buffer:"<<p; ch=cin.peek(); if(ch=='\n') { ch=cin.get(); break; } }while(true...
* 文件名:file.c * 功能: 实现了指纹相关文件的操作 * modified by PRTsinghua@hotmail.com #############################################################################*/ #include #include #include...
c语言不使用strcat函数连接两个字符串(适合大学生,c语言初学者)
字符操作及其有关函数实现字符串复制函数: char * my_strcpy(char * dest, const char * src); 字符串拼接函数: char *my_strcat(char *dest, char *src); 实现 memcpy 拷贝:内存拷贝: void * memcpy(void * dest, ...
此文档对strcat函数做了详细的说明以及举例说明其用法,同时也把他的函数原型给列出来了