【问题标题】:NULL terminated c_str()?NULL 终止 c_str()?
【发布时间】:2013-10-08 05:56:20
【问题描述】:

为什么使用is_it_valid_color("yellow") 有效,输出FOUND IT 但使用is_it_valid_color(x.c_str()); 无效?

我感觉它与以空字符结尾的字符串有关。输出在控制台中看起来相同:

color: 'yellow'
FOUND IT
color: 'yellow'

.

const char *color_names[] = {"yellow", "green", "red"};
const int color_names_SIZE = 3;

void is_it_valid_color(const char* color) {
    cout << "color: '" << color << "'" << endl;

    for(int i = 0; i < color_names_SIZE; ++i) {
        if(color == *(color_names + i)) {   
            cout << "FOUND IT" << endl;
            break;
        }
    }
}



is_it_valid_color("yellow");


string x = "yellow";

is_it_valid_color(x.c_str());

【问题讨论】:

  • 简答:使用std::string,问题就会消失。

标签: c++ string null-terminated c-strings


【解决方案1】:

您不是在比较字符串,而是在比较指向字符串的指针。

第一个匹配是因为您的链接器已将两个字符串“黄色”合并为同一个物理指针以节省内存。因此,它们的地址比较相同。

要比较实际字符串本身,请使用strcmp() 或类似名称。

【讨论】:

    【解决方案2】:

    您在此处比较内存地址(在指针中)而不是字符串(以空字符结尾的字符序列):

    if(color == *(color_names + i)) {   
    

    您需要改用std::strcmp

    if(std::strcmp(color, *(color_names + i)) == 0) {   
    

    除非您出于学习原因需要,否则使用下标运算符比使用指针算术更清晰。

    另外,c_str() 肯定是空终止的。

    【讨论】:

      【解决方案3】:

      您不应该使用 '==' 运算符来与 char* 的比较

      您应该使用 cstring 库中的 strcmp 函数

      for(int i = 0; i < color_names_SIZE; ++i) {
          if(strcmp(color,color_names[i]) == 0) {   
              cout << "FOUND IT" << endl;
              break;
          }
      }
      

      http://en.cppreference.com/w/cpp/string/byte/strcmp

      【讨论】:

        【解决方案4】:

        重写代码的一部分,你(据称)比较字符串。

        毫无疑问,c_str() 和 char* 都是空终止的。

        【讨论】:

          【解决方案5】:

          您正在比较指针而不是字符串。简单的解决方法是改变

          const char *color_names[] = {"yellow", "green", "red"};
          

          std::string color_names[] = {"yellow", "green", "red"};
          

          尽量不要在任何地方使用指针,它们只会造成麻烦,尤其是在你学习的时候。无需添加指针的所有复杂性,您就可以学习足够的知识。

          【讨论】:

          • 该项目实际上是关于学习指针如何工作的,显然我需要继续学习:)
          • 好的,char* 的复杂性之一是它有时表现得像一个指针,有时它表现得像一个字符串。不幸的是,您假设它的行为像一个字符串,而实际上它是一个指针。如果你必须继续使用 char* 那么 strcmp 就是其他人所说的答案。
          猜你喜欢
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-29
          • 1970-01-01
          相关资源
          最近更新 更多