The compare trap example for std::string is explained in C and C++

  • 2020-06-01 10:22:28
  • OfStack

preface

C++ language is a 10 point excellent language, but excellent does not mean perfect. There are still a lot of people who don't want to use C or C++, why? One of the reasons is that C/C++ text processing is too cumbersome to use. When I haven't been exposed to other languages before, whenever people say this, I always dismiss them as not understanding the essence of C++, or not understanding C++ at all. Now after I touch perl, php, and Shell script, I begin to understand why some people say C++ text processing is inconvenient.

In a word, with string, C++ 's character text processing function has finally been supplemented. In addition, STL' s text processing function has been greatly reduced compared with perl, shell and php when it is used with other containers of STL. So mastering string will make your job a lot easier.

string is simple to use

In fact, string is not a single container, just a single typedef of the basic_string template class, which corresponds to wstring. You will find the following code in the string header file:


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

Since it only explains the use of string, this article does not distinguish between string and basic_string without special instructions.

string is really equivalent to a sequence container for holding characters, so in addition to the usual operations of a string, there are also operations that contain all sequence containers. Common string operations include: add, delete, modify, find comparison, link, input, output, and so on.

Without further ado, take a look at the body of this article.

scenario

1.std::string is often used to store string data, but it can also be used as byte storage for any byte.

2. Normally we use the compare method of std::string to compare strings, but this method is not reliable for comparing strings.

instructions

1.compare method is not the same as strcmp method std::string size() All the bytes in size size() In the length range, if there is a '\0' character, it is better to convert it to if you do not know whether std::string stores pure strings or not const char* (调用c_str()) , then call strcmp comparison. The pit is still scary.

example

1. The following example is a good example of why compare is not appropriate when comparing strings.


#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;
}

Output:


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

conclusion


Related articles: