首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C/C++ 處理含空白字元的字串輸入完整指南

     編輯:關於C語言

核心問題

scanf("%s", buf)、cin >> str 遇空白(空格、換行、Tab)即停止,無法讀取整行含空格字串。

C 語言解法

1. fgets(推薦)

char buf[100];
fgets(buf, sizeof(buf), stdin);
// 移除結尾換行
buf[strcspn(buf, "\n")] = '\0';
  • 安全、可指定緩衝區大小、自動保留空格。
  • 需自行處理結尾 \n。

2. scanf("%[^\n]") 掃描集

char buf[100];
scanf("%99[^\n]", buf); // 讀到換行為止
getchar(); // 吃掉殘留 \n

3. getline (POSIX,非標準 C)

char *line = NULL; size_t len = 0;
getline(&line, &len, stdin); // 自動配置記憶體
free(line);

C++ 解法

1. std::getline(標準、推薦)

std::string s;
std::getline(std::cin, s); // 含空格整行

2. std::cin.getline (C 風格)

char buf[100];
std::cin.getline(buf, 100);

完整對比範例

// C 版
#include <stdio.h>
#include <string.h>
int main() {
    char s1[100], s2[100];
    printf("fgets: "); fgets(s1, 100, stdin); s1[strcspn(s1,"\n")]='\0';
    printf("scanf: "); scanf("%99[^\n]", s2); getchar();
    puts(s1); puts(s2);
    return 0;
}

// C++ 版
#include <iostream>
#include <string>
int main() {
    std::string s1, s2;
    std::getline(std::cin, s1);
    std::getline(std::cin, s2);
    std::cout << s1 << '\n' << s2 << '\n';
    return 0;
}

常見坑點

  • 混用 scanf/cin 與 getline:前者留下 \n 導致後者讀到空行。解決:呼叫 getchar() 或 cin.ignore() 吃掉換行。
  • 緩衝區溢位:scanf("%s") 無長度限制,必須用 %99s 或 fgets。
  • 多行讀取:迴圈呼叫 fgets/getline 直到 EOF。

最佳實務建議

  1. C:統一用 fgets + 去換行工具函數。
  2. C++:統一用 std::getline,搭配 std::string 自動管理記憶體。
  3. 若需解析欄位,讀整行後用 strtok/stringstream 分割。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved