构建代码:指针“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”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 EditText 上的空指针异常 [重复]

在Linux下有将字符串进行大小写转换的函数吗

删除空指针[重复]

在指针c ++的向量中打印指针的值[重复]

Unity 3d启用鼠标指针作为事件触发器的指针进入/退出[重复]

切片指针和循环[重复]