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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:18:34