C语言调用strcpy报passing argument 1 makes pointer from integer without a cast警告求助
编译警告直接原因
你触发警告的核心问题出在aux变量的定义上:
- 你声明的
char aux是单个字符类型的变量,而C标准库的strcpy函数第一个入参要求是char *类型的缓冲区指针。你传入单个char变量时,编译器会把char值(本质是整数)隐式转为指针地址,就会抛出passing argument 1 of 'strcpy' makes pointer from integer without a cast的类型不匹配警告。
代码其他隐藏问题
除了上述警告对应的错误,你的代码还有多处逻辑和语法问题:
- 循环变量
i没有初始化就直接在while条件中读取,值是随机的,要么直接跳过循环,要么会导致数组越界访问。 - 就算把
aux改为char *类型,也没有给它分配足够的内存空间存储剩余子串,直接写入会触发非法内存访问,运行时直接崩溃。 - 没有判断目标替换子串
w2和原待替换子串w1的长度关系:如果w2长度大于w1,直接往原字符串s中写入会溢出s的缓冲区,破坏其他内存数据。 - 替换逻辑错误:你先把剩余字符串拷到
aux,再把w2拷到s+i的位置后,用strcat(s, aux)会把剩余内容拼到整个s的末尾,而不是接在刚写入的w2后面,替换逻辑完全不对。
修正后的参考实现
#include <stdio.h> #include <string.h> #include <stdlib.h> void remplacer(char *s, int s_buf_len, char *w1, char *w2) { int i = 0; int w1_len = strlen(w1); int w2_len = strlen(w2); int s_len = strlen(s); // 空串无需替换 if (w1_len == 0 || s_len < w1_len) return; while (i <= s_len - w1_len) { if (strncmp(s + i, w1, w1_len) == 0) { // 先计算剩余字符串长度,申请足够的aux空间 int rest_len = s_len - i - w1_len + 1; // +1存结束符'\0' char *aux = (char *)malloc(rest_len); if (aux == NULL) return; // 内存申请失败直接返回 // 拷贝替换位置之后的剩余内容 strcpy(aux, s + i + w1_len); // 检查缓冲区是否足够容纳替换后的内容 if (i + w2_len + rest_len - 1 >= s_buf_len) { free(aux); return; } // 写入新子串,再拼接剩余内容 strcpy(s + i, w2); strcpy(s + i + w2_len, aux); // 更新字符串长度和循环变量 s_len = s_len - w1_len + w2_len; i += w2_len; free(aux); } else { i++; } } }
调用时需要传入原字符串
s的总缓冲区长度,避免缓冲区溢出。
内容的提问来源于stack exchange,提问作者héla talbi
相关产品推荐
相关产品推荐

