scanf("%s", buf)、cin >> str 遇空白(空格、換行、Tab)即停止,無法讀取整行含空格字串。
fgets(推薦)char buf[100]; fgets(buf, sizeof(buf), stdin); // 移除結尾換行 buf[strcspn(buf, "\n")] = '\0';
\n。scanf("%[^\n]") 掃描集char buf[100];
scanf("%99[^\n]", buf); // 讀到換行為止
getchar(); // 吃掉殘留 \n
getline (POSIX,非標準 C)char *line = NULL; size_t len = 0; getline(&line, &len, stdin); // 自動配置記憶體 free(line);
std::getline(標準、推薦)std::string s; std::getline(std::cin, s); // 含空格整行
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。fgets + 去換行工具函數。std::getline,搭配 std::string 自動管理記憶體。strtok/stringstream 分割。