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
,而且这个列表还在继续......
我可以花几个小时来研究string
比char
更好,或者我可以链接到其他类似的答案:
【讨论】:
你的意思是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++通过指针变量对键盘输入的字符串中的字符按ASCII码值从小到大排列有如下要求定义一个字符数组