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

C++:如何向map添加字符而非ASCII值?程序循环后终止问题

问题分析与解决方案

1. 键值对逻辑错误(核心问题)

你期望将每个双字符输入的第二个字符作为键,第一个字符作为值,但当前代码中是把第一个字符作为键、第二个作为值存入map,完全搞反了逻辑。

修改encrypt函数中的赋值语句:

// 原代码:用第一个字符当键,第二个当值
letter_pair[inpt.at(0)] = inpt.at(1);
// 修改为:用第二个字符当键,第一个当值
letter_pair[inpt.at(1)] = inpt.at(0);

2. 循环结束后后续代码不执行的问题

while(cin >> input)会持续从标准输入读取字符串,直到遇到**EOF(文件结束符)**才会退出循环。你觉得程序直接终止,实际是程序还在等待输入结束信号:

  • Windows系统:输入完内容后,按Ctrl + Z再回车
  • Linux/macOS系统:输入完内容后,按Ctrl + D

执行这个操作后,循环会正常退出,后续的遍历输出代码就会执行。

3. 输出显示ASCII数值的问题

你的map<char,char>中键是char类型,cout默认会输出字符而非ASCII数值。出现这个问题的原因是之前的键值逻辑错误,导致你看到的键是输入的第一个字符的ASCII值(比如输入ab时,键是'a',对应ASCII 97),修正键值逻辑后,输出就会显示你期望的字符键。

修正后的完整代码

#include <string>
#include <iostream>
#include <map>

using std::string, std::cin, std::cout, std::endl, std::map;

void encrypt(string const &inpt, map<char,char> &letter_pair){
    // 修正键值对应关系:第二个字符为键,第一个为值
    letter_pair[inpt.at(1)] = inpt.at(0);
}

int main(){
    string input;
    map<char,char> letter_pair;
    
    while(cin >> input ){
        encrypt(input, letter_pair);
    }
    
    for(auto pos = letter_pair.begin(); pos != letter_pair.end();++pos){
        cout << "'" << pos->first << "' : '" << pos->second << "'" << endl;
    }
}

补充说明:原encrypt函数返回了传入的map引用,这完全没必要,直接改成void类型更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:47:36