C语言中修改已初始化字符串变量最后4个字符的方法问询
关于修改字符串最后4个字符的问题
先直接给你梳理清楚答案:
1. 能否修改已初始化的字符串变量的最后4个字符?
得看你的字符串定义方式:
- 如果是字符数组(比如
char str[20] = "hello world";):完全可以修改,数组的内容是可写的内存区域。 - 如果是字符串字面量赋值给指针(比如
char *str = "hello world";):绝对不能碰!字符串字面量存在只读内存区,强行修改会触发未定义行为(大概率直接程序崩溃)。
2. C语言中修改字符串最后4个字符的正确操作,以及你给出的代码问题
先拆解你写的代码:
int size; char a[10] = "something"; size = strlen(a) - 4; strcat(a + size, "1234");
这个代码既得不到somet1234,还会触发缓冲区溢出的危险,原因有两个:
strcat的作用是追加而非替换——它会找到a + size指向的子串的结束符'\0',然后把"1234"拼在后面。原数组a里是"something\0",a + size指向的是a[5](对应子串"hing\0"),所以strcat会把"1234"追加到"hing"后面,最终变成"something1234"。但你的a数组只有10字节容量,原字符串已经占满了(9个字符+1个'\0'),追加4个字符直接超出数组边界,会破坏内存里的其他数据,属于严重的未定义行为。- 就算数组空间足够,
strcat也做不到替换最后4个字符,它只会在现有字符串末尾加内容。
正确的替换方式
如果确定字符串长度≥4,直接定位到倒数第4个字符的位置覆盖即可:
#include <string.h> #include <stdio.h> int main() { // 数组要留足够空间,这里定义20字节避免溢出 char a[20] = "something"; int len = strlen(a); if (len >= 4) { // 定位到倒数第4个字符的地址,用strcpy直接覆盖(自带'\0') strcpy(a + len - 4, "1234"); } printf("%s\n", a); // 输出somet1234 return 0; }
strcpy会把"1234"(包括末尾的'\0')直接覆盖从len-4开始的位置,刚好替换掉原来的最后4个字符,完美得到你想要的结果。
额外提醒
- 永远要确保字符数组的空间足够,避免缓冲区溢出。可以用
sizeof(a)检查剩余空间:比如追加操作前,判断sizeof(a) - strlen(a) >= 要追加的字符数。 - 别用指针指向字符串字面量来修改,比如
char *a = "something";这种写法,字符串是只读的,修改必出问题。
内容的提问来源于stack exchange,提问作者Daniel F. Patiño
相关产品推荐
相关产品推荐

