CS50无元音编程题:strcat函数参数类型不匹配报错求助
CS50无元音编程题报错分析与修复
错误原因
编译器报错的核心是类型不匹配:strcat函数的第二个参数要求是const char*(指向以\0结尾的字符串的指针),但你在else分支里传递的是单个char(word[i]或变量p)。char本质是8位整数类型,和指针类型无法直接转换,因此触发类型转换错误。
修复方案
这里提供两种可行的修复方式:
方案1:临时字符串适配strcat要求
为单个字符创建一个包含终止符的临时字符串,再传给strcat:
else { char temp_str[2]; temp_str[0] = word[i]; temp_str[1] = '\0'; // 必须添加字符串终止符,否则strcat会读取内存垃圾 strcat(new, temp_str); }
方案2:手动管理数组索引(更高效推荐)
每次调用strcat都会遍历目标字符串找末尾,效率较低。可以直接用索引跟踪new数组的写入位置,手动赋值:
#include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { string word = get_string("Give me a word: " ); int len = strlen(word); int i; int new_pos = 0; // 记录new数组当前写入的位置 char new[len + 1]; for (i = 0; i < len; i++) { if (word[i] == 'e') { new[new_pos++] = '3'; } else if (word[i] == 'i') { new[new_pos++] = '1'; } else if (word[i] == 'a') { new[new_pos++] = '6'; } else if (word[i] == 'o') { new[new_pos++] = '0'; } else { new[new_pos++] = word[i]; } } new[new_pos] = '\0'; // 最后必须添加字符串终止符,否则printf会输出垃圾内容 printf("%s\n", new); }
这种方式不需要依赖strcat,逻辑更直接,性能也更好。
额外注意
原代码中new数组初始化时设置new[0] = '\0';是正确的(保证初始是一个空字符串),但如果用方案2,就不需要这个初始化,直接通过new_pos从0开始赋值即可。
内容的提问来源于stack exchange,提问作者Boriscodes
相关产品推荐
相关产品推荐

