可以使用 cin 向動態分配的 char* 數組輸入字符串,但必須滿足兩個前提:
#include <iostream>
#include <cstdio> // scanf_s
int main() {
const int MAX_LEN = 100;
char* buffer = new char[MAX_LEN]; // 1. 分配足夠緩衝區
// 方式一:cin 配合寬度限制 (C++11)
// std::cin >> std::setw(MAX_LEN) >> buffer; // 需 #include
// 方式二:cin.getline (推薦,可讀取含空格行)
std::cin.getline(buffer, MAX_LEN);
// 方式三:scanf_s (最安全,微軟推薦)
// scanf_s("%s", buffer, (unsigned)MAX_LEN); // 不含空格
// scanf_s("%[^\n]", buffer, (unsigned)MAX_LEN); // 含空格
std::cout << "輸入內容: " << buffer << std::endl;
delete[] buffer; // 釋放內存
return 0;
}
| 方法 | 緩衝區保護 | 讀取空格 | 推薦場景 |
|---|---|---|---|
cin >> buffer | 無(危險) | 否 | 不推薦 |
cin.getline(buf, size) | 有(限制size-1字符) | 是 | C++首選 |
scanf_s("%s", buf, size) | 有(必須傳size) | 否 | C風格、高性能 |
scanf_s("%[^\n]", buf, size) | 有 | 是 | C風格讀整行 |
fgets(buf, size, stdin) | 有 | 是 | 跨平台C標準 |
#include <iostream>
#include <string>
int main() {
std::string str;
std::getline(std::cin, str); // 自動管理內存、無長度限制、安全
std::cout << "輸入: " << str << std::endl;
return 0;
}
動態char*數組可用cin.getline(buffer, size)安全賦值,前提是分配足夠緩衝區並傳入長度限制。微軟環境推薦scanf_s強制檢查長度。**現代C++首選std::string完全避免手動內存管理風險**。