輸入一行以空格分隔的整數,長度不固定,需存入數組。例如:1 123 1234 22 → a[0]=1, a[1]=123, a[2]=1234, a[3]=22。
利用 getchar() 逐字符讀取,遇到數字時用 ungetc() 放回流,再用 cin >> a[i] 直接讀取整數,自動跳過空格。
int a[50], i = 0;
char c;
while ((c = getchar()) != '\n') {
if (c >= '0' && c <= '9') {
ungetc(c, stdin);
cin >> a[i++];
}
}
優點:無需手動解析數字邊界,利用流提取器自動處理。
逐字符構建當前數字字符串,遇到空格或換行時 atoi 轉換存入。
int a[50], i = 0;
char c; string buf;
while ((c = getchar()) != '\n') {
if (c >= '0' && c <= '9') buf += c;
else if (c == ' ') { a[i++] = atoi(buf.c_str()); buf.clear(); }
}
if (!buf.empty()) a[i++] = atoi(buf.c_str()); // 最後一個數
最簡潔健壯:
string line; getline(cin, line); stringstream ss(line); vectora; int x; while (ss >> x) a.push_back(x); // a 即為結果數組
| 方法 | 優點 | 缺點 |
|---|---|---|
| getchar+ungetc | 無需緩衝區,流式處理 | 混用 C/C++ IO 需注意同步 |
| string+atoi | 邏輯直觀,無依賴 | 需手動處理最後一個數 |
| getline+stringstream | 標準庫、自動分割、動態擴容 | 略多分配內存 |
現代 C++ 首選 getline + stringstream 或直接 while (cin >> x) vec.push_back(x)(若輸入不換行)。若輸入量極大(百萬級),可用快速 IO(scanf、自定義快速讀)。