C++:通过 char* 获取字符串输入

Posted

技术标签:

【中文标题】C++:通过 char* 获取字符串输入【英文标题】:C++: Getting an string input through char* 【发布时间】:2016-12-31 09:36:55 【问题描述】:

我对在 C++ 中输入字符串感到完全困惑。

char str[4];
cin>>str;
cout<<str;

有效。但是

char* str;
cin>>str;
cout<<str;

不起作用。 为什么?

【问题讨论】:

你的意思是str=new char[4];问题会得到解决。 是的,但是你会有更多的问题,看我的回答。 【参考方案1】:

因为在第二种情况下,没有分配内存:您正在写入未定义的内存区域 => UB(可能:SEGV)

您可以使用str=new char[4];,但如果您输入超过 3 个字符,也会出现缓冲区溢出问题,并且由于您无法控制用户输入的内容,因此无法确保不会发生这种情况。

(当然也可能发生在您的第一个工作案例中)

所以,既然您使用的是 C++,我建议您像这样使用std::string

std::string str;
cin>>str;
cout<<str;

没有更多的char * 或数组,没有更多的分配,内存泄漏......:真正的 C++。当您想与 C 函数交互时,您仍然可以使用 str.c_str() 获取对象的 const char * 表示形式。

您还可以像这样连接 string 对象:a + b,而不是可怕的 strcat,而且这个列表还在继续......

我可以花几个小时来研究stringchar 更好,或者我可以链接到其他类似的答案:

std::string vs. char* Why should C++ programmers minimize use of 'new'?

【讨论】:

你的意思是str=new char[4];会解决我的问题? 会解决你的立即问题。但是请不要使用 char 数组,你有 C++ 的能力,使用它。 @Bob__ 已经开始了,但我不想用平庸的方式解释它。正在寻找一个 SO 帖子。【参考方案2】:

正如 Jean-François Fabre 所说,您可以使用 std::string 来实现您的目标。

如果您想使用纯 C 语法和 char 数组(具有固定大小 N - 在您的情况 3 中),您可能会使用类似的东西:

#define N 3
char str[N + 1];
fgets(str, sizeof(str), stdin);

这样可以确保您不会遇到溢出。

【讨论】:

以上是关于C++:通过 char* 获取字符串输入的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中通过引用传递 char 的效率

从 C++ 库方法返回的“char*”获取 C# 字符串?

C#从返回char指针的c++函数中获取字符串/字符值

c++通过指针变量对键盘输入的字符串中的字符按ASCII码值从小到大排列有如下要求定义一个字符数组

尝试返回 c++ 输入文件的大小,但在将 char 变量转换为字符串时收到错误

在 C++ 中获取多个输入文件并将其保存在数组中