轉自:http://www.cnblogs.com/opsing/p/3435963.html#commentform
C++中的char是個基本類型,跟int一樣;而string卻是個庫自帶的類,string這個類包括很多成員函數,比如<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=push_back&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">push_back</a>(), insert(), append()等,聲明的變量是個對象,但不需要程序員自動析構。
可參考:<a target=_blank href="http://www.cplusplus.com/reference/string/string/" target="_blank">http://www.cplusplus.com/reference/string/string/</a>
<strong>下面是C中字符串與C++字符串的區別。</strong> 1) 在C語言中,將字符串作爲字符數組來處理。即C string就是 char arrary[MAX_SIZE];字符數組。 而C++中的string 是 string class, 聲明形式 string strObject.變量是個對象。只是他是C++ 標準庫提供的<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=string%E7%B1%BB&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">string類</a>, 其實現效果跟用戶自定義的類一樣。 2) C string 字符串可以用字符串數組 char Array[MAX_SIZE];與字符串變量 char *p; 兩種方式來存儲。 以 '\0'爲字符串結束標誌。 strlen 是把串結束符 '\0'算在內的,而sizeof是在對字符數組和字符變量的操作結果不一樣,引起原理不一樣。 strcmp, strncmp,連接使用strcat, 不能 str1+str2, strchr(str1, ch); 在str1中查找ch第一次出現的位置,返回<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=%E6%8C%87%E9%92%88%E5%8F%98%E9%87%8F&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">指針變量</a> 而C++ string是類,是對象.結束符是npos,或者-1; 不用指定字符數目的大小。 + 取代了strcat length和size取代了strlen append, compare, substr,find, find_firt_of等函數 可以直接=, 而不用strncpy。 insert, replace, at, erase, clear, swap還有iterator函數的實現。 3) 在函數實現部分printf,scanf, fprinf等可以format的一個字符串中使用 "%s"時,只能用c string;如果是C++ string的話,就必須先變成 c string,否則就會報錯。如:
a)
string str ("Test string"); printf("%s\n", str);
編譯錯誤:warning: cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime執行錯誤:Illegal instruction(coredump)
b)
void strprint(const char *s) { printf("function: %s\n%", s); } string str ("Test string"); strprint(str);
編譯錯誤:error: cannot convert 'std::string' to 'const char*' for argument '1' to 'void strprint(const char*)'因爲c string是基本類型:char 或char array;而c++ string卻是個類,是個對象。二者的實現截然不同,不同場合的使用需要轉換。修改:只需要將a), b)中的str變爲 str.<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=c_str&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">c_str</a>()即可。另外,C++ string的<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=c_str&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">c_str</a>()函數能給出c string 和C++ string的部分區別的解釋。 4)頭文件只有在使用c string的strncpy, strtok等<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=%E5%BA%93%E5%87%BD%E6%95%B0&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">庫函數</a>時才include <<a target=_blank class="inner-link decor-none" href="http://zhidao.baidu.com/search?word=string.h&fr=qb_search_exp&ie=utf8" rel="nofollow" target="_blank">string.h</a>>而C++中,則在聲明 string 對象時include <string>