cin.getline读取char数组时postalcode未正确获取的问题咨询
问题分析与解决方案
核心错误点
你的代码存在两个关键问题,直接导致postalcode无法正确获取:
cin.getline参数顺序完全错误istream::getline的正确函数签名是:getline(char* buf, streamsize buf_size, char delim = '\n')。你把缓冲区大小和分隔符的位置搞反了,第一个cin.getline(province, ',')实际是把逗号的ASCII值(44)当作缓冲区大小,这会导致缓冲区溢出和读取逻辑混乱。- 数组大小不足,缺少字符串终止符空间
C风格字符串必须以'\0'结尾,所以:- 要存"ON"(2个字符),
province至少需要3个元素的空间; - 要存"n6n7y7"(6个字符),
postalcode至少需要7个元素的空间。
原代码的数组大小会导致写入越界,触发未定义行为。
- 要存"ON"(2个字符),
为什么第二个getline失效?
第一个错误的getline调用已经破坏了输入流的状态,加上你把'\0'作为分隔符(输入流中不会自然出现这个字符),参数顺序错误又让函数把'\0'的ASCII值(0)当作缓冲区大小,直接导致第二个getline完全无法正常读取。
修正后的代码
不需要额外缓冲区,只需修正参数顺序和数组大小:
#include <iostream> using namespace std; int main() { char province[3]; // 2个字符 + '\0' char postalcode[7]; // 6个字符 + '\0' // 读取到逗号为止,最多读取2个字符(留位置给终止符) cin.getline(province, sizeof(province), ','); // 读取剩余的整行内容,最多读取6个字符 cin.getline(postalcode, sizeof(postalcode)); // 验证输出 cout << "省份:" << province << endl; cout << "邮编:" << postalcode << endl; return 0; }
关键说明
sizeof(province)直接获取数组大小,避免手动写死数值出错;- 第一个
getline遇到逗号时会自动丢弃逗号,不会存入province; - 第二个
getline使用默认分隔符(换行),会读取输入行剩余的所有内容(直到换行)。
内容的提问来源于stack exchange,提问作者roberto roldan
相关产品推荐
相关产品推荐

