1

我正在练习 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;
}
4

3 回答 3

2

撇开当标准库之类的东西可用时在 C++ 中使用裸指针通常是不可取的事实std::string,您不应该使用malloc. 例如:而不是,您应该在程序末尾(char*) malloc(10)new char[10]并记住 to 。delete[] *(stringSet+i)

也就是说,这条线:

cin >> num

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

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

String 1:  foobar
String 2: 

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

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

cin.ignore();

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

于 2013-09-26T23:14:56.693 回答
1
cin >> num;

这将提示用户进行一些输入。假设用户做了他们期望的事情,他们会输入一些数字,然后他们会按下回车键。数字将存储在输入缓冲区中,但换行符也将存储在输入缓冲区中,这是由于它们按回车键而添加的。 cin将解析数字以生成一个整数,并将其存储在num变量中。它在换行符处停止,该换行符保留在输入缓冲区中。稍后,您调用getline,它在输入缓冲区中查找换行符。它会立即找到一个,因此它不需要提示用户进行更多输入。所以看起来第一次调用 getline 没有做任何事情,但实际上它做了。

于 2013-09-26T23:13:31.463 回答
0

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

cin >> num读取一个数字,整数,除了数字什么都没有。它不会读取数字后面的任何内容,例如换行符。所以第一个 getline 读取你已经输入的换行符。

顺便说一句,您应该使用cerr而不是cout用户提示。

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

于 2013-09-26T23:13:57.233 回答