C/C++中关于std::string的compare陷阱示例详解

 更新时间:2017年11月21日 14:46:31   作者:infoworld  
这篇文章主要给大家介绍了关于C/C++中关于std::string的compare陷阱的相关资料,文中先对C/C++中的std::string进行了简单的介绍,通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

前言

C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触 perl, php, 和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。

总之,有了string 后,C++的字符文本处理功能总算得到了一定补充,加上配合STL其他容器使用,其在文本处理上的功能已经与perl, shell, php的距离缩小很多了。 因此掌握string 会让你的工作事半功倍。

string简单使用

其实,string并不是一个单独的容器,只是basic_string 模板类的一个typedef 而已,相对应的还有wstring, 你在string 头文件中你会发现下面的代码:

extern "C++" {
typedef basic_string <char> string;
typedef basic_string <wchar_t> wstring;
} // extern "C++"

由于只是解释string的用法,如果没有特殊的说明,本文并不区分string 和 basic_string的区别。

string 其实相当于一个保存字符的序列容器,因此除了有字符串的一些常用操作以外,还有包含了所有的序列容器的操作。字符串的常用操作包括:增加、删除、修改、查找比较、链接、输入、输出等。

下面话不多说了,来一起看看本文的正文。

场景

      1.std::string 我们经常用来存储字符串数据, 当然它也可以作为byte的存储器,存储任意字节.

      2.通常情况下我们使用 std::string 的 compare 方法比较字符串, 但这个方法比较奥字符串是不可靠的.

说明

1.compare 方法和 strcmp并不相同, 它比较的是 std::string size()大小里的所有字节.在size() 长度范围里, 如果有'\0'字符, 一样进行比较, 所有在不知道 std::string里是否存储纯字符串时, 最好先转换为 const char* (调用c_str()) , 再调用 strcmp比较. 这个坑还是很吓人的.

例子

1.以下例子很好的说明在比较字符串时 compare并不适合.

#include <string>
#include <iostream>
#include <string.h>

int main(int argc, char const *argv[]){
 std::string str("hello");
 str.append(1,'\0');
 str.append(1,'i');

 std::cout << str.size() << std::endl;
 std::cout << str << std::endl;
 std::cout << str.compare("hello") << std::endl;
 std::cout << strcmp(str.c_str(),"hello") << std::endl;


 return 0;
}

输出:

$ ./test-string.exe
7
hello
2
0

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • C++中双冒号::用法案例详解

    C++中双冒号::用法案例详解

    这篇文章主要介绍了C++中双冒号::用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C++实现Go的defer功能(示例代码)

    C++实现Go的defer功能(示例代码)

    defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。接下来通过本文给大家介绍C++实现Go的defer功能,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • C++ Primer注解之引用和指针

    C++ Primer注解之引用和指针

    这篇文章主要介绍了C++ Primer注解之引用和指针的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 深入了解C语言中常见的文件操作方法

    深入了解C语言中常见的文件操作方法

    这篇文章主要为大家详细介绍了C语言中常见的文件操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++面试八股文之如何避免死锁详解

    C++面试八股文之如何避免死锁详解

    在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,那么如何避免死锁的情况出现呢,下面就为大家简单讲讲
    2023-07-07
  • C语言实现简单弹跳小球

    C语言实现简单弹跳小球

    这篇文章主要为大家详细介绍了C语言实现简单弹跳小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++实现String与UF8互转

    C++实现String与UF8互转

    这篇文章介绍了C++实现String与UF8互转的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C语言之快速排序算法(递归Hoare版)介绍

    C语言之快速排序算法(递归Hoare版)介绍

    大家好,本篇文章主要讲的是C语言之快速排序算法(递归Hoare版)介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • C语言之地址传递和引用传递的问题

    C语言之地址传递和引用传递的问题

    这篇文章主要介绍了C语言之地址传递和引用传递的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • C++中唯一三元运算符?:实例详解

    C++中唯一三元运算符?:实例详解

    这篇文章主要给大家介绍了关于C++中唯一三元运算符?:的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论