在C语言中,strcat
函数用于将一个字符串追加到另一个字符串的末尾
所以它最大的用处,就是增长和拼接字符串(拼接可以定义新数组,使用strcpy后再使用strcat)
char *strcat(char *dest, const char *src
dest
:目标字符串,src
字符串将被追加到这个字符串的末尾。dest
必须有足够的空间来容纳追加后的结果src
:源字符串,将被追加到目标字符串的末尾
所以字符就很神奇,同strcpy、赋值,strcat也是第一个位置作为目标字符串
下面看看最要关心的字符结束符问题
strcat
函数会首先找到目标字符串dest
中的第一个空字符(即'\0'
),然后将源字符串src
的内容复制到这个位置,覆盖掉'\0'
,并在复制完成后在src
的末尾添加一个新的'\0'
- 因此,目标字符串
dest
必须有足够的空间来容纳源字符串src
的内容以及一个新的结束符'\0'
so,strcat非常懂人情世故。那么再来看看使用fgets输入时关于换行符的问题
在 C 语言中,使用 fgets
从标准输入读取字符串时,输入的换行符(\n
)会被包含在读取的字符串中(没有舍命陪君子时)。如果你想在使用 strcat
连接字符串时避免换行符,可以在使用 fgets
之后手动去除换行符
好吧,这个必须自己动手,丰衣足食
去除换行符的操作如下:
- 先使用
strlen
获取s
tr 的长度。 - 直接检查最后一个字符是否为换行符(
\n
) - 如果是(当然你自己肯定明白fgets有没有舍命陪君子),将其替换为字符串结束符(
\0
),以去除换行符
那么,问题来了。之前的strlen表示的数字存储的就是字符结束符\0(两个原因导致,之前说过)
我将倒数第二个字符也替换成\0,那不就拥有两个字符结束符了?
其实不然。在C语言中每个字符串只能有一个结束符,且它必须位于字符串的末尾
以下是详细的解释:
- 字符串的结构:在 C 语言中,字符串实际上是一个字符数组,以
'\0'
结尾。例如,字符串"Hello\n"
在内存中表示为{'H', 'e', 'l', 'l', 'o', '\n', '\0'}
- 去除换行符:当你使用
fgets
读取字符串时,如果用户输入了"Hello"
并按下回车,src
将会包含{'H', 'e', 'l', 'l', 'o', '\n', '\0'}
。通过检查最后一个字符并将其替换为'\0'
(在替换操作中,换行符被移除,字符串的长度会相应减少),你将得到{'H', 'e', 'l', 'l', 'o', '\0'}
,这时字符串的长度变为 5 strcat
的工作原理:strcat
函数会从目标字符串的末尾开始查找'\0'
,并将源字符串的内容复制到目标字符串的末尾,直到遇到源字符串的'\0'
。因此,在去除换行符后,目标字符串的末尾仍然是一个有效的'\0'
,strcat
可以正常工作
//所以编译器很聪明,放心大胆地替换吧!替换后使用strcat完全没有问题
但是,替换后请记住字符串的长度发生了变化,那么你要重新使用strlen计算,心里要明白!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main() {
char str[999];
fgets(str, 999, stdin);
printf("%d\n", strlen(str));
str[strlen(str) - 1] = '\0';
printf("%d", strlen(str));
return 0;
}
这个我写的,发现真是这样!哈哈,AI 诚不欺我!
Comments NOTHING