构建代码:指针“strlwr”[重复]
Posted
技术标签:
【中文标题】构建代码:指针“strlwr”[重复]【英文标题】:Build code: "strlwr" by pointer [duplicate] 【发布时间】:2014-06-09 13:52:54 【问题描述】:有人可以告诉我这段代码的不同之处:
char *s1 ="Con Chim Non";
还有这个:
char *s=new char[100];
gets(s);
然后,我添加这个词:"Con Chim Non"
。
之后,我构建了一个更改指针值的代码。在第一个代码中,我遇到了关于地址的问题。第二个是对的。这是我的代码:
void Strlwr(char *s)
if (s == NULL )
return ;
for (int i = 0; s[i] != '\0'; ++i)
if ( s[i] <= 'Z' && s[i] >= 'A')
s[i] = s[i]+32;
有人可以告诉我为什么第一个是错的。
【问题讨论】:
区别在于第一个不是有效的C++11,也不是C++14,第二个是无效的C++14。 你能给我解释清楚吗?我使用了第二个并得到了正确的结果。gets
已从 C++ 中删除。这是一个糟糕的功能,对防止缓冲区溢出没有任何作用。甚至 C 也不想要它,并在 C11 中摆脱了它。
【参考方案1】:
第一个例子:
char *s1 ="Con Chim Non";
您声明一个指向文本文字的指针,它是常量。 文本字面量不能修改。
正确的语法是:
char const * s1 = "Con Chim Non";
注意const
。
在您的第二个示例中,您声明并为 动态 内存中的 100 个字符保留内存:
char *s=new char[100];
gets(s);
然后,您将从输入中获取 未知数量 的字符并将它们放入数组中。
由于您使用 C++ 语言进行编程,因此您应该避免这种文本处理并使用更安全的 std::string
数据类型。
例如,gets
函数会将未知数量的字符从控制台读取到数组中。如果你声明一个 4 个字符的数组并输入 10 个字符,你会得到一个buffer overflow
,这是非常糟糕。
std::string
类将根据需要扩展以包含内容。它还将管理内存重新分配。
【讨论】:
以上是关于构建代码:指针“strlwr”[重复]的主要内容,如果未能解决你的问题,请参考以下文章