C语言实现strcpy函数遇错误:无法将const char*赋值给char*求助
解决
Can't assign const char* to char* 错误并正确复刻strcpy函数 咱们先拆解你遇到的编译错误和代码里的关键问题,一步步搞定:
核心错误原因
你调用strcpy("Sample", cPtr)时犯了两个致命问题:
- 参数顺序完全搞反了:标准
strcpy的逻辑是char* strcpy(char* 目标缓冲区, const char* 源字符串)——把源的内容复制到目标里,你刚好写反了。 - 字符串字面量
"Sample"的类型是const char*(只读内存区的内容),而strcpy的第一个参数需要可写的char*缓冲区,编译器不允许把只读指针赋值给可写指针,这就是报错的直接原因。
另外你的strcpy函数还没写完,retPtr = des...是拼写错误,应该是dest。
其他需要修正的细节
除了核心错误,代码里还有几个不符合C标准和规范的点:
fflush(stdin)是未定义行为:C标准只允许对输出流用fflush,别用它清输入缓冲区。scanf("%s", &tmp)多了个&:tmp本身就是数组首地址,直接写scanf("%s", tmp)就行。- 自定义
strlen的参数应该用const char*:计算字符串长度不需要修改内容,用const更符合代码规范。
修正后的完整代码
#include <stdio.h> // 修正strlen的参数为const char*,符合const正确性 int strlen(const char* s) { int count = 0; while (*s != '\0') { // 用'\0'比0x00更直观,可读性更强 count++; s++; // s = s+0x01可以简化为s++ } return count; } // 完整实现strcpy函数,保留目标缓冲区的起始地址用于返回 char* strcpy(char* dest, const char* src) { char* retPtr = dest; // 逐字符复制,直到源字符串的结束符 while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; // 手动添加字符串结束符,保证目标是合法的C字符串 return retPtr; } int main() { char tmp[100]; char* cpyString; printf("Enter word: "); scanf("%s", tmp); // 正确的参数顺序:目标缓冲区在前,源字符串在后 char dest[100]; // 定义一个可写的目标缓冲区 cpyString = strcpy(dest, tmp); printf("new count is %d\n", strlen(cpyString)); return 0; }
额外说明
如果你的需求是把"Sample"复制到tmp里,那调用应该改成strcpy(tmp, "Sample")——把只读的源字符串"Sample"复制到可写的tmp缓冲区,完全符合类型要求,不会再报错。比如:
// 示例:把"Sample"复制到tmp strcpy(tmp, "Sample"); cpyString = tmp; printf("new count is %d\n", strlen(cpyString)); // 会输出6
这样就能完美解决编译错误,同时正确实现strcpy的功能。
内容的提问来源于stack exchange,提问作者MasterGuapo
相关产品推荐
相关产品推荐

