在研究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);这种链式调用。在某些场合很方便。
分享到:
相关推荐
22. **字符串连接**:`strcat()`函数用于连接两个字符串。 23. **C++与C语言关系**:C++是C语言的超集,支持面向对象编程,而C语言主要是过程式编程。 24. **可执行文件扩展名**:C++编译的可执行文件通常以`.exe`...
连结字符串**:连接两个字符串的函数是 `strcat` 或者 `std::string` 类中的 `+` 操作符。 - **正确答案**:**A. 查找子串** #### 3. 文件打开方式 - **题目解析**:题目要求以读写模式打开位于 A 盘上 user 子...
连结字符串**:连接两个字符串的函数是`strcat`。 **正确答案**:A #### 3. 若要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是: **选项解析**: - **A) fopen("A:\...
可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...
- **字符串操作**:`cstring` 和 `string` 库提供了多种字符串操作函数,如 `strlen`, `strcpy`, `strcat` 等。 - **数学函数**:`cmath` 库包含了各种数学函数,例如 `sqrt` (平方根), `log` (对数), `exp` (指数) ...
书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...
previous up contents next C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日... o 8.6 我有个函数, 本该返回一个字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。 ...
还可以使用C风格的字符串函数,如`strcpy()`、`strcat()`、`strcmp()`和`strlen()`。 掌握这些基本概念是学习C++的第一步,随着深入,还将涉及类、对象、继承、多态、模板等更高级的主题。学习C++需要不断实践和...
2. **字符串处理**:`strlen()` 用于获取字符串长度,`strcpy()` 和 `strncpy()` 用于复制字符串,`strcmp()` 和 `strncmp()` 进行字符串比较,`strcat()` 和 `strncat()` 实现字符串连接。 3. **内存管理**:`...
P9610.2.5 字符串函数strcat P9710.2.6 字符串函数:字符串搜索函数 P9811.1.1 枚举:枚举 P9911.2.1 结构:结构类型 P10011.2.2 结构:结构:结构与函数 P10111.2.3 结构:结构中的结构 P10211.3.1 联合:类型定义 ...
回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。. . 4 1.9 main() 的正确定义是什么? void main() 正确吗? . . . . . . . . ...
《C++程序设计》复习题涉及了C++的基础语法、数据类型、运算符、控制结构、内存管理、字符串操作、预处理指令等多个方面。以下是针对这些知识点的详细解析: 1. **标识符**:C++中的标识符可以是字母、数字和下划线...
字符串和字符函数库`<string.h>`和`<ctype.h>`则提供了如`strlen`、`strcpy`、`strcat`、`isdigit`、`isalpha`等函数,用于字符串处理和字符特性检测。 例如,`math.h`库中的`acos`函数接受一个介于-1到1之间的双...
11. 字符串处理:字符串的概念,以及strcat、strlen等函数。 12. 进制转换、补码表示、动态内存分配:深入理解内存管理。 13. 链表:作为数据结构的基础,了解其工作原理和操作方法。 通过实际的编程例子,如一元二...