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

C语言从stdin读取内容时传char到char*参数报错如何修复

错误根因
  • strcpy是字符串拷贝函数,要求入参必须是两个char*类型的地址,分别对应目标字符串首地址、源字符串首地址。你传入的dictionary[counter].line_two[i]和c都是单个char类型的字符值,完全不符合函数入参要求,因此触发类型转换报错。
  • 原有代码还存在多处逻辑缺陷:未在循环内读取下一个字符会导致死循环、未判断EOF/换行符会异常读取、未给字符串加\0结束符会导致乱码、无数组边界判断容易触发越界。
修复方案

方案1:保留逐字符读取逻辑,替换错误的赋值代码

直接删除strcpy调用,改为单个字符赋值,同时补全缺失的逻辑:

for (counter=0; counter<=MAX_DICT_WORDS-1; counter++)
{    
    if (counter%3==1)
    {
        i = 0;
        int c; // 改用int类型存储getchar返回值,才能正确判断EOF
        c = getchar();
        // 同时跳过空格、换行,判断读取结束
        while (c != ' ' && c != '\n' && c != EOF)
        {
            dictionary[counter].line_two[i] = c;
            i++;
            // 新增边界判断,避免数组越界,将LINE_TWO_MAX_LEN替换为你的line_two数组成员的实际最大长度
            if (i >= LINE_TWO_MAX_LEN - 1) break;
            c = getchar();
        }
        // 给字符串补结束符,是C字符串合法的必要条件
        dictionary[counter].line_two[i] = '\0';
    }
}

方案2:使用内置函数简化逻辑

如果你的需求就是按空格分隔读取连续字符串,直接用scanf即可自动跳过所有空白字符、自动加字符串结束符,代码更简洁:

// 将1023替换为你的line_two数组最大长度减1,避免缓冲区溢出
scanf("%1023s", dictionary[counter].line_two);
注意事项
  • 确保结构体的line_two成员是预先分配了足够空间的char数组,如果是未分配空间的char*指针,需要先调用malloc分配内存后再写入内容。
  • 所有字符串操作必须预留至少1位空间存储\0结束符,禁止超出数组边界写入。

内容的提问来源于stack exchange,提问作者Aquila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 21:06:02