C++中不使用getline读取含空格字符串的方法咨询
解决带空格字符串与整数混合读取的问题
这个场景我太熟悉了——当输入里既有带空格的字符串,又有紧跟的数值时,常规的cin或scanf确实会“卡壳”。给你两种实用的解决方案,分别适配C++和C语言场景:
方法一:C++ 用 stringstream 灵活解析
核心思路是先拆分输入的不同部分,再用字符串流来处理带空格的城市名:
#include <iostream> #include <string> #include <sstream> #include <cctype> using namespace std; int main() { char code; string city; int num1, num2, num3; string remaining_line; // 读取第一个字符(自动跳过前置空白) cin >> code; // 忽略code后的空格,避免getline读到空内容 cin.ignore(); // 读取剩余的整行内容(包含城市名和三个整数) getline(cin, remaining_line); // 将剩余内容放入字符串流,方便逐段解析 istringstream iss(remaining_line); // 提取城市名:读取所有非数字字符,直到遇到第一个整数 while (iss.peek() != EOF && !isdigit(static_cast<unsigned char>(iss.peek()))) { char c; iss.get(c); city += c; } // 去掉城市名末尾多余的空格 if (!city.empty() && city.back() == ' ') { city.pop_back(); } // 读取后面三个整数 iss >> num1 >> num2 >> num3; // 测试输出 cout << "代码: " << code << endl; cout << "城市: " << city << endl; cout << "数值: " << num1 << ", " << num2 << ", " << num3 << endl; return 0; }
关键细节:
cin.ignore()必须加:因为cin >> code会留下输入缓冲区里的空格,直接用getline会读到空行,导致后续解析失败。- 用
iss.peek()判断下一个字符是否为数字,精准截取城市名,避免把整数前的空格包含进去。
方法二:C语言 用 scanf 格式控制符
如果用C语言,可以利用scanf的%[]格式控制符,直接读取非数字字符作为城市名:
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char code; char city[100]; // 假设城市名长度不超过99 int num1, num2, num3; // 读取第一个字符,前置空格用于跳过输入开头的空白 scanf(" %c", &code); // 读取所有非数字字符作为城市名,%*c跳过数字前的空格 scanf(" %[^\d]%*c", city); // 去掉城市名末尾的多余空格 char* end_ptr = city + strlen(city) - 1; while (end_ptr >= city && isspace((unsigned char)*end_ptr)) { *end_ptr = '\0'; end_ptr--; } // 读取三个整数 scanf("%d %d %d", &num1, &num2, &num3); // 测试输出 printf("代码: %c\n", code); printf("城市: %s\n", city); printf("数值: %d, %d, %d\n", num1, num2, num3); return 0; }
关键细节:
%[^\d]是scanf的正则式用法,表示读取所有非数字字符,刚好匹配带空格的城市名。%*c用于跳过城市名和第一个整数之间的空格,确保后续scanf能正确读取数值。
内容的提问来源于stack exchange,提问作者pharos23
相关产品推荐
相关产品推荐

