将标准输入读入 char 数组 - C++
Reading in standard input into a char array - C++
我想知道从捕获白色 space 的命令行获取输入的公认方式是什么。我以为这样就可以了...
char text[500];
int textSize = 0;
int main() {
while (!cin.eof()) {
cin >> text[textSize];
textSize++;
}
for(int i = 0; i < textSize; i++) {
cout << text[i];
}
return 0;
}
但看起来它跳过了白色 space。我切换到这个...
char c;
while ((c = getchar()) != EOF) {
text[textSize] = c;
textSize++;
}
效果很好,但我是从一本 C 编程书中了解到的。想知道我将如何在 C++ 中处理它
默认情况下,C++ 中的流提取运算符将跳过空格。您可以使用 noskipws
流操纵器来控制它:
while (!cin.eof()) {
cin >> noskipws >> text[textSize];
textSize++;
}
就是说,如果您读取太多文本,您编写的程序有一个非常明显的缓冲区溢出问题。如果您计划读取固定数量的字节,请使用 istream::read
。如果您想读取可变数量的字节,请考虑将 std::string
与 istream::get
结合使用,如下所示:
std::string input;
char ch;
while (cin.get(ch)) {
input += ch;
}
这没有缓冲区溢出的风险,并且应该处理尽可能多的文本(当然,受限于可用内存。)
我想知道从捕获白色 space 的命令行获取输入的公认方式是什么。我以为这样就可以了...
char text[500];
int textSize = 0;
int main() {
while (!cin.eof()) {
cin >> text[textSize];
textSize++;
}
for(int i = 0; i < textSize; i++) {
cout << text[i];
}
return 0;
}
但看起来它跳过了白色 space。我切换到这个...
char c;
while ((c = getchar()) != EOF) {
text[textSize] = c;
textSize++;
}
效果很好,但我是从一本 C 编程书中了解到的。想知道我将如何在 C++ 中处理它
默认情况下,C++ 中的流提取运算符将跳过空格。您可以使用 noskipws
流操纵器来控制它:
while (!cin.eof()) {
cin >> noskipws >> text[textSize];
textSize++;
}
就是说,如果您读取太多文本,您编写的程序有一个非常明显的缓冲区溢出问题。如果您计划读取固定数量的字节,请使用 istream::read
。如果您想读取可变数量的字节,请考虑将 std::string
与 istream::get
结合使用,如下所示:
std::string input;
char ch;
while (cin.get(ch)) {
input += ch;
}
这没有缓冲区溢出的风险,并且应该处理尽可能多的文本(当然,受限于可用内存。)