#include <iostream>
using namespace std;
int main() {
char * c;
cin >> c;
return 0;
}
我正在尝试从长度未知的用户处获取C字符串行。我知道如果我将c
声明为char c[80]
而不是char * c
,那么它就不会导致段错误。
但是,如果我不想将用户限制为80 - 1
个字符,该怎么办?我可以使用一个非常大的数字但这只会浪费空间。
我还想知道为什么上面的程序会导致段错误。据我所知,cin
提取运算符(>>
)知道NULL
终止一个C字符串。究竟是什么导致了这个问题?
答案 0 :(得分: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
答案 1 :(得分:2)
当您仅使用char *c;
时,您没有为字符串分配任何空格。变量声明创建一个指向char
的指针,该指针未初始化。然后使用cin
将字符串读入该空间。 c
可以指向任何,并且无论如何都会指向不属于您的记忆。
在尝试从cin
填充字符串之前,您需要为字符串分配空间。
如果您不想对字符串长度设置限制,则可以循环并realloc
更多空间,直到完全读取输入,但如上所述,如果使用{{1而不是C字符串,那么这将为您处理。
答案 2 :(得分:0)
那是因为你没有为你的字符串分配内存。