0

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

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

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

*in.length() 

sizeof(*in)/sizeof(char)

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

4

4 回答 4

1

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

in->length();

或者

(*in).length();

在第二种情况下,括号是必需的,因为.它具有更高的优先级*

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

void makeLowerCase(std::string& in)
{
    std::transform(in.begin(), in.end(), in.begin(), ::tolower);
}
于 2016-01-27T15:33:12.763 回答
0
*in.length() 

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

(*in).length() 

sizeof(*in)/sizeof(char)

是相同的

sizeof(*in) / 1

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


这些信息与迭代器、for_each和 lambdas 相结合,构成了一个没有任何函数的漂亮的三行代码:

#include <cctype>

...

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

笔记:

  • 改用引用。它们看起来更好,更容易使用。指针应该只在 C++ 中用于低级的东西,或者在没有办法删除它们时使用。
于 2016-01-27T15:31:26.697 回答
0

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

in->length()

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

(*in)[i]
于 2016-01-27T15:34:01.410 回答
0

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

in->length();

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

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

for (auto it=in->begin(); it!=in->end(); ++it) {
    *it = std::tolower(*it);
}
于 2016-01-27T15:34:16.810 回答