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

请求排查并修正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;
}

关键修正点说明

  1. 用std::string处理输入:完全替代了字符数组,符合你"不能使用cstring或字符数组"的要求,用input.size()获取字符串长度,替代strlen()。
  2. 修复字符比较错误:把所有双引号的字符串改成单引号的字符,解决了编译错误。
  3. 统一字符大小写:用tolower()把输入字符转成小写,这样不用同时判断大写和小写的情况,简化逻辑。
  4. 修正循环逻辑:用单个for循环遍历字符串的每个字符,逻辑清晰,避免嵌套循环的混乱。
  5. 读取用户输入:用getline()读取用户输入的完整单词(如果只需要单个单词,也可以用cin >> input)。

这样代码就能正常编译运行,满足你的作业要求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:28:55