【问题标题】:Get a char from a pointer to a string从指向字符串的指针中获取 char
【发布时间】:2016-01-27 23:51:00
【问题描述】:

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

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

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

*in.length() 

sizeof(*in)/sizeof(char)

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

【问题讨论】:

  • 为什么不使用参考呢? void makeLowerCase(std::string& in)
  • 如果您使用 C++,您应该使用函数内部提供的库,但是...在该语句之外,传入 std::string 的地址,然后 in 将是一个可以操作的指针。
  • 使用指针时使用-> 而不是.

标签: c++ function pointers tolower


【解决方案1】:

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

in->length();

(*in).length();

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

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

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

【讨论】:

    【解决方案2】:

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

    in->length()
    

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

    (*in)[i]
    

    【讨论】:

      【解决方案3】:
      *in.length() 
      

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

      (*in).length() 
      
      sizeof(*in)/sizeof(char)
      

      相同
      sizeof(*in) / 1
      

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


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

      #include <cctype>
      
      ...
      
      for (char& c : str)
          c = std::tolower(c);
      

      注意事项:

      • 改用引用。它们看起来更好,更容易使用。指针只能在 C++ 中用于低级内容或无法删除它们的情况。

      【讨论】:

        【解决方案4】:

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

        in->length();
        

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-05-19
          • 2015-06-22
          • 1970-01-01
          • 2019-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-19
          • 1970-01-01
          相关资源
          最近更新 更多