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
相关产品推荐
相关产品推荐

