从指向字符串的指针获取一个字符

Get a char from a pointer to a string

你好,我正在尝试编写一个函数,通过使用指针而不是 return 值将字符串转换为小写。

void makeLowerCase(std::string* in){
//for loop tolower(char from *in);}

但我不知道如何从我的指针中获取每个字符以使用 tolower() ,或者如何获取字符串中有多少个字符

*in.length() 

sizeof(*in)/sizeof(char)

不要为它工作。前者我在使用指针时出错,后者我得到相同的 return 值 sizeof(*in) 所以我什至不知道我将如何结束我的 for 循环。

*in.length() 

不起作用,因为 . 的优先级高于 *。使用括号:

(*in).length() 

sizeof(*in)/sizeof(char)

相同
sizeof(*in) / 1

因为sizeof(char) == 1sizeof(*in) == sizeof(std::string),所以这会产生 std::string 对象本身的大小,而不是字符串 implemention-defined.


此信息与迭代器、for_each 和 lambda 相结合,构成了一个漂亮的 three-liner,没有任何函数:

#include <cctype>

...

for (char& c : str)
    c = std::tolower(c);

备注:

  • 改用引用。它们看起来更好,更易于使用。指针只应在 C++ 中用于 low-level 东西或当没有办法将它们删除时。

您可以通过引用传递字符串,而不是通过指针传递和处理指针语法,然后您可以像正常使用它一样使用它 std::string。如果您必须使用指针,那么您可以使用

in->length();

(*in).length();

第二种情况需要括号,因为 . 的优先级高于 *

至于将字符串转换为小写,您可以使用 <algorithm> 中的内置函数,这会给您

void makeLowerCase(std::string& in)
{
    std::transform(in.begin(), in.end(), in.begin(), ::tolower);
}

C++ 有一个获取指针指向的对象成员的快捷方式:

in->length()

要访问字符,请使用括号:

(*in)[i]

对于指针,您将使用指针运算符。那就是

in->length();

然而,裸循环不是理想的方式(老实说,使用指针也不是)。

更好的方法是使用迭代器遍历字符串并以这种方式进行转换。

for (auto it=in->begin(); it!=in->end(); ++it) {
    *it = std::tolower(*it);
}