cin.getline()跳过第一次迭代

时间:2013-09-26 22:57:32

标签: c++

我正在练习c字符串/指针,无法解决这个简单的问题。 cin.getline()没有提示第一次迭代的用户输入,但对连续的字符串这样做。 (我任意选择10作为char限制)。

我忽略了一些非常简单的事情吗?

void    getStrings() {    
int num;

cout << "How many strings?  ";
cin >> num;

const int numStrings = num;

char** stringSet = (char**) malloc(numStrings * sizeof(char*));

for (int i = 0; i < numStrings; i++) {
    *(stringSet + i) = (char*) malloc(10);
    cout << "String " << i << ": ";
    cin.getline(stringSet[i], 10);
    cout << endl;
}

3 个答案:

答案 0 :(得分:2)

在标准库std::string之类的东西可用的情况下,通常不建议在C ++中使用裸指针这一事实,你不应该使用malloc。例如:您应该写(char*) malloc(10)而不是new char[10],并在程序结束时记住delete[] *(stringSet+i)

那说,行:

cin >> num

...仅提取 它遇到的第一个数字。如果在遇到任何数字之前遇到任何非空白字符,它将失败(并且cin将设置其fail位,并且需要使用cin.reset()重置)。

但是之后停止从输入中提取。在输入流中,输入中仍然存在任何空格或其他字符。例如,如果您在按Enter键之前运行此程序并键入“2 foobar”,则会立即打印:

String 1:  foobar
String 2: 

这是因为流仍然包含“foobar\n”。

为了获得您正在寻找的行为,您可能希望在循环之前添加它:

cin.ignore();

这将清除那里的任何东西。

答案 1 :(得分:1)

cin >> num;

这将提示用户输入一些内容。假设用户做了他们所期望的,他们将键入一些数字,他们将按Enter键。数字将存储在输入缓冲区中,但是换行符也是如此,这是因为它们点击了回车键。 cin将解析数字以生成一个整数,它存储在num变量中。它停在换行符中,换行符保留在输入缓冲区中。稍后,您调用getline,它在输入缓冲区中查找换行符。它立即找到一个,因此不需要提示用户输入任何内容。因此看起来第一次调用getline没有做任何事情,但事实上确实如此。

答案 2 :(得分:0)

你的意思是“第一次迭代没有提示用户输入”?我读到这意味着“不打印输入第一个字符串的提示”,但根据您的代码,我认为这意味着“在读取输入之前打印输入前两个字符串的提示”。

cin >> num读取一个数字,整数,只读数字。它不会读取数字后面的内容,如换行符。所以第一个getline读取你已经输入的换行符。

顺便说一句,您应该使用cerr代替cout来提示用户。

cout应保留用于实际输出。这使脚本编写变得更加容易,因为您可以独立于cout重定向cerr,并且因为您不想在程序结果中捕获提示。