请求排查并修正C++字母转手机键盘数字代码的编译错误
解决你的编译错误与代码重构问题
首先,咱们先搞定那个编译错误:"ISO C++ forbids comparison between pointer and integer"。你代码里写的l=="a"是问题根源——"a"是字符串字面量,本质是const char*类型的指针,而l是char类型(属于整数类型),C++不允许指针和整数直接比较。你需要把双引号换成单引号,比如l == 'a',这样才是字符和字符比较。
接下来,咱们梳理代码里的其他问题,顺便满足你"不能使用cstring或字符数组"的要求:
代码里的其他问题
- 未初始化变量:你在
int l=a[n];这里用了还没赋值的n,这会导致访问数组的随机位置,属于未定义行为。 - 循环逻辑混乱:外层
for循环和内层while循环的条件重叠,会导致无限循环或者完全不符合预期的遍历逻辑。 - 硬编码输入:你直接用了
char a[]="Hello";,没有读取用户的输入,不符合作业要求。 - 违反禁用规则:你用了
char数组和strlen()(属于cstring库),需要换成C++标准的std::string来处理字符串。
修正后的完整代码
我按照你的要求重构了代码,用std::string替代字符数组,去掉了cstring相关的依赖,同时修正了所有逻辑错误:
#include<iostream> using namespace std; void Letter_correspondence(); int main() { Letter_correspondence(); return 0; } void Letter_correspondence() { cout << "Enter the letters of the word you want to convert to numbers: "; string input; getline(cin, input); // 读取用户输入的完整字符串 for (size_t i = 0; i < input.size(); ++i) { char c = tolower(input[i]); // 统一转成小写,避免区分大小写的判断 // 每第3个字符后加连字符(注意索引从0开始,所以i==2对应第3个字符) if (i == 2) { cout << "-"; } if (c >= 'a' && c <= 'c') { cout << "2"; } else if (c >= 'd' && c <= 'f') { cout << "3"; } else if (c >= 'g' && c <= 'i') { cout << "4"; } else if (c >= 'j' && c <= 'l') { cout << "5"; } else if (c >= 'm' && c <= 'o') { cout << "6"; } else if (c >= 'p' && c <= 's') { cout << "7"; } else if (c >= 't' && c <= 'v') { cout << "8"; } else if (c >= 'w' && c <= 'z') { cout << "9"; } // 如果输入非字母,可以在这里加默认处理,比如输出原字符或者提示 } cout << endl; }
关键修正点说明
- 用
std::string处理输入:完全替代了字符数组,符合你"不能使用cstring或字符数组"的要求,用input.size()获取字符串长度,替代strlen()。 - 修复字符比较错误:把所有双引号的字符串改成单引号的字符,解决了编译错误。
- 统一字符大小写:用
tolower()把输入字符转成小写,这样不用同时判断大写和小写的情况,简化逻辑。 - 修正循环逻辑:用单个
for循环遍历字符串的每个字符,逻辑清晰,避免嵌套循环的混乱。 - 读取用户输入:用
getline()读取用户输入的完整单词(如果只需要单个单词,也可以用cin >> input)。
这样代码就能正常编译运行,满足你的作业要求啦!
内容的提问来源于stack exchange,提问作者Hassan Iftikhar
相关产品推荐
相关产品推荐

