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

