3
#include <iostream>

using namespace std;

int main() {
    char * c;
    cin >> c;
    return 0;
}

我正在尝试从长度未知的用户那里获取 C 字符串行。我知道如果我声明cchar c[80]而不是char * cthen 它不会导致段错误。

但是,如果我不想将用户限制为80 - 1字符怎么办?我可以使用一个非常大的数字,但这只会浪费空间。

我也很想知道为什么上述程序会导致段错误。据我了解,cin提取运算符 ( >>) 知道NULL终止 C 字符串。究竟是什么导致了这个问题?

4

3 回答 3

7

程序段错误,因为指针c未初始化。在将数据读入缓冲区之前,您需要为缓冲区分配内存:

char * c = new char[80];
cin >> c;
cout << c << endl;
delete[] c; // Now you need to delete the memory that you have allocated.

为避免将输入限制为N字符,请使用字符串。它们会根据您的需要动态调整大小:

string c;
cin >> c;
cout << c;
// You do not need to manage string's memory - it is done automatically
于 2012-08-19T04:21:34.753 回答
2

当您仅使用char *c;. 变量声明创建了一个char未初始化的指针。然后,您使用cin将字符串读入该空间。c可以指向任何东西,而且无论如何都会指向不属于你的记忆。

在尝试从cin.

如果您不想假设对字符串长度的限制,您可以循环和realloc更多空间,直到输入被完全读取,但如前所述,如果您使用std::string而不是 C 字符串,那么这将为您处理。

于 2012-08-19T04:21:55.603 回答
0

那是因为您没有为字符串分配内存。

于 2012-08-19T04:22:38.957 回答