cin >> str 或 scanf("%s") 遇到空白(空格、Tab、換行)即停止,無法讀取完整行或含空格的字串。正確做法是使用行導向輸入函數。
std::getline#include
#include
int main() {
std::string line;
std::cout << "請輸入一行文字(可含空格):";
std::getline(std::cin, line); // 讀取整行,含前導/尾隨空格,不含換行符
std::cout << "您輸入:" << line << '\n';
return 0;
}
std::getline(cin, str, '|')。cin >> n 留下換行符,需先 cin.ignore(std::numeric_limits::max(), '\n'); 清除。fgets / getline (POSIX)fgets(標準 C,普遍可用)#include
#include
#define MAX_LEN 1024
int main() {
char buf[MAX_LEN];
printf("輸入:");
if (fgets(buf, MAX_LEN, stdin)) {
// 移除尾部換行符(若有)
buf[strcspn(buf, "\n")] = '\0';
printf("內容:%s\n", buf);
}
return 0;
}
MAX_LEN-1,剩餘字元留在 stdin,下次讀取會繼續讀取殘留部分。getline / getdelim(POSIX.1-2008,Linux/macOS/BSD)#include
#include
int main() {
char *line = NULL;
size_t len = 0;
ssize_t nread;
printf("輸入(Ctrl+D 結束):\n");
while ((nread = getline(&line, &len, stdin)) != -1) {
if (nread > 0 && line[nread-1] == '\n') line[nread-1] = '\0';
printf("長度 %zd:%s\n", nread, line);
}
free(line); // 必須釋放
return 0;
}
_GNU_SOURCE 或 -D_POSIX_C_SOURCE=200809L。| 現象 | 原因 | 解決 |
|---|---|---|
第一次 getline 讀到空字串 | 前一次 scanf/cin>> 留下 '\n' | 先呼叫 getchar() / cin.ignore() 吃掉換行 |
| 輸入超長被截斷 | fgets 緩衝區固定大小 | 改用 getline (POSIX) 或 C++ std::getline |
Windows 下 getline 讀到 '\r' | CRLF 換行 | 手動移除尾部 '\r':if (line[len-1]=='\r') line[--len]=0; |
std::getline + std::string,搭配 std::stringstream 做後續解析。getline(動態記憶體、無長度限制),不支援平台時退回 fgets + 循環讀取拼接。strtok_r、sscanf、或 C++ std::istringstream 分割,避免直接用 scanf 格式字串處理複雜輸入。