`
rys5851968
  • 浏览: 151546 次
社区版块
存档分类
最新评论

字符串拼接函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪? C/C++求职面试必备考点(三)

 
阅读更多

在研究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);这种链式调用。在某些场合很方便。





分享到:
评论

相关推荐

    c++ 考试复习题

    22. **字符串连接**:`strcat()`函数用于连接两个字符串。 23. **C++与C语言关系**:C++是C语言的超集,支持面向对象编程,而C语言主要是过程式编程。 24. **可执行文件扩展名**:C++编译的可执行文件通常以`.exe`...

    C++期末考试题定义.pdf

    连结字符串**:连接两个字符串的函数是 `strcat` 或者 `std::string` 类中的 `+` 操作符。 - **正确答案**:**A. 查找子串** #### 3. 文件打开方式 - **题目解析**:题目要求以读写模式打开位于 A 盘上 user 子...

    C++期末考试题宣贯.pdf

    连结字符串**:连接两个字符串的函数是`strcat`。 **正确答案**:A #### 3. 若要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是: **选项解析**: - **A) fopen("A:\...

    你必须知道的495个C语言问题

    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...

    c++基础要点

    - **字符串操作**:`cstring` 和 `string` 库提供了多种字符串操作函数,如 `strlen`, `strcpy`, `strcat` 等。 - **数学函数**:`cmath` 库包含了各种数学函数,例如 `sqrt` (平方根), `log` (对数), `exp` (指数) ...

    《你必须知道的495个C语言问题》

    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...

    C语言FAQ 常见问题列表

    previous up contents next C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日... o 8.6 我有个函数, 本该返回一个字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。 ...

    新手学C++基础

    还可以使用C风格的字符串函数,如`strcpy()`、`strcat()`、`strcmp()`和`strlen()`。 掌握这些基本概念是学习C++的第一步,随着深入,还将涉及类、对象、继承、多态、模板等更高级的主题。学习C++需要不断实践和...

    C函数速查手册 chm文档 中文注释

    2. **字符串处理**:`strlen()` 用于获取字符串长度,`strcpy()` 和 `strncpy()` 用于复制字符串,`strcmp()` 和 `strncmp()` 进行字符串比较,`strcat()` 和 `strncat()` 实现字符串连接。 3. **内存管理**:`...

    csdn 翁恺 C 语言程序设计(完) 视频.txt

    P9610.2.5 字符串函数strcat P9710.2.6 字符串函数:字符串搜索函数 P9811.1.1 枚举:枚举 P9911.2.1 结构:结构类型 P10011.2.2 结构:结构:结构与函数 P10111.2.3 结构:结构中的结构 P10211.3.1 联合:类型定义 ...

    你必须知道的495个C语言问题(PDF)

    回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。. . 4 1.9 main() 的正确定义是什么? void main() 正确吗? . . . . . . . . ...

    C++程序设计复习题及参考答案.pdf

    《C++程序设计》复习题涉及了C++的基础语法、数据类型、运算符、控制结构、内存管理、字符串操作、预处理指令等多个方面。以下是针对这些知识点的详细解析: 1. **标识符**:C++中的标识符可以是字母、数字和下划线...

    关键字 、运算符优先级、库函数.docx

    字符串和字符函数库`&lt;string.h&gt;`和`&lt;ctype.h&gt;`则提供了如`strlen`、`strcpy`、`strcat`、`isdigit`、`isalpha`等函数,用于字符串处理和字符特性检测。 例如,`math.h`库中的`acos`函数接受一个介于-1到1之间的双...

    C语言学习大纲(讲解).pdf

    11. 字符串处理:字符串的概念,以及strcat、strlen等函数。 12. 进制转换、补码表示、动态内存分配:深入理解内存管理。 13. 链表:作为数据结构的基础,了解其工作原理和操作方法。 通过实际的编程例子,如一元二...

Global site tag (gtag.js) - Google Analytics