【问题标题】:Reading in standard input into a char array - C++将标准输入读入 char 数组 - C++
【发布时间】:2016-02-06 18:46:48
【问题描述】:

我想知道从命令行获取输入的可接受方式是什么,它也捕获空白。我以为这样就可以了...

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;
}

但看起来它跳过了空白。我切换到这个...

char c;

while ((c = getchar()) != EOF)  {
    text[textSize] = c;
    textSize++;
}

效果很好,但我从一本 C 编程书中知道这一点。想知道我将如何在 C++ 中处理它

【问题讨论】:

  • 你可以使用istream::get
  • char text[500]; 而是使用std::string
  • while (!cin.eof()) 是个错误
  • 我会看看 istream。谢谢! MM,你说的错误是什么意思?

标签: c++ arrays iostream


【解决方案1】:

默认情况下,C++ 中的流提取运算符将跳过空格。您可以使用noskipws 流操纵器来控制它:

while (!cin.eof()) {
    cin >> noskipws >> text[textSize];
    textSize++;
}

也就是说,如果您阅读的文本过多,您编写的程序会出现非常明显的缓冲区溢出问题。如果您打算读取固定数量的字节,请使用istream::read。如果您想读取可变数量的字节,请考虑将std::stringistream::get 结合使用,如下所示:

std::string input;
char ch;

while (cin.get(ch)) {
    input += ch;
}

这没有缓冲区溢出的风险,并且应该处理尽可能多的文本(当然,受可用内存的限制。)

【讨论】:

  • 谢谢!当您说缓冲区溢出的风险时-您的意思是因为如果输入大于数组,则数组将没有正确的终止。我还看到,在插入输入“input += ch”时,您实际上不必提供迭代索引。当我尝试打印出来时,我认为我可以通过输入 ++ 来迭代它,但这不起作用
  • @cpd1 是的,或多或少是他的意思。确切的答案是,当您尝试这样做时,您会得到未定义的行为。有关详细说明,请参阅此内容:stackoverflow.com/questions/1239938/… 您不能执​​行 input++,因为 input 是字符串类型,并且 ++ 运算符未在字符串上定义。在字符串上定义的是 + 运算符,它只是附加两个字符串,或者在本例中是字符串和字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多