我正在练习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;
}
答案 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
,并且因为您不想在程序结果中捕获提示。