You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现strcpy函数遇错误:无法将const char*赋值给char*求助

解决 Can't assign const char* to char* 错误并正确复刻strcpy函数

咱们先拆解你遇到的编译错误和代码里的关键问题,一步步搞定:

核心错误原因

你调用strcpy("Sample", cPtr)时犯了两个致命问题:

  1. 参数顺序完全搞反了:标准strcpy的逻辑是char* strcpy(char* 目标缓冲区, const char* 源字符串)——把源的内容复制到目标里,你刚好写反了。
  2. 字符串字面量"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:30:27