1. 程式人生 > >string中c_str()的用法

string中c_str()的用法

1.

語法:

1 const char *c_str();

c_str()函式返回一個指向正規C字串的指標常量, 內容與本string串相同。

這是為了與c語言相容,在c語言中沒有string型別,故必須通過string類物件的成員函式c_str()把string 物件轉換成c中的字串樣式。

注意:一定要使用strcpy()函式 等來操作方法c_str()返回的指標。

比如:最好不要這樣:

1 char* c;
2 string s="1234";
3 c = s.c_str();

c最後指向的內容是垃圾,因為s物件被析構,其內容被處理,同時,編譯器也將報錯——將一個const char *賦與一個char *。

應該這樣用:

1 char c[20];
2 string s="1234";
3 strcpy(c,s.c_str());

這樣才不會出錯,c_str()返回的是一個臨時指標,不能對其進行操作。

再舉個例子:

c_str() 以 char* 形式傳回 string 內含字串,如果一個函式要求char*引數,可以使用c_str()方法:

1 string s = "Hello World!";
2 printf("%s", s.c_str());    // 輸出 "Hello World!"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main()
{

char *c;
    string s1="zhanghong";
c=s1.c_str();

/*
string s1="zhanghong";
char c[20];
strcpy(c,s1.c_str());
    cout<<c<<endl;
   // strcpy()
    */
//    cout<<c<<endl;
return 0;

}

列印結果:

[email protected]:~/shell$ g++ cstr.cpp
cstr.cpp: In function ‘int main()’:
cstr.cpp:13:13: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]

[email protected]:~/shell$ 

例項二:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;


int main()
{
/*
char *c;
    string s1="zhanghong";
c=s1.c_str();
*/

string s1="zhanghong";
char c[20];
strcpy(c,s1.c_str());
    cout<<c<<endl;
   // strcpy()
    
//    cout<<c<<endl;
return 0;

}

[email protected]:~/shell$ ./a.out
zhanghong
[email protected]:~/shell$ 

#include <iostream>  
#include <string>  
int main() {  
 std::string s = "Chelse";  
 const char *str = s.c_str();  
 std::cout << str << std::endl;  
 s[1] = 'm';  
 std::cout << str << std::endl;  
 return 0;  

[email protected]:~/shell$ 

[email protected]:~/shell$ g++ cstr.cpp
[email protected]:~/shell$ g++ string.cpp
[email protected]:~/shell$ ./a.out
Chelse

Cmelse

string.c_str是Borland封裝的String類中的一個函式,它返回當前字串的首字元地址。

c_str函式的返回值是const char*的,不能直接賦值給char*,所以就需要我們進行相應的操作轉化。

#include <iostream>  
#include <string>  
int main() {  
    std::string s = "Chelse";  
    const char *str = s.c_str();  
    std::cout << str << std::endl;  
    s[1] = 'm';  
    std::cout << str << std::endl;  

    return 0;  
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第一個輸出 當然是 Chelse; 
第二個輸出呢: Chelse還是Cmelse呢? 
答案是Cmelse。 
const char*的值應該是個常量啊,怎麼還能改變值呢? 
這就是很多人遇到的坑兒,也許面試的時候你會順利的回答出來,但是在實際的工程中,往往掉進坑兒裡,難以自拔。 
const char*, char const*, char* const的區別是什麼?老 
const char*與char const*是等價的,指的是指向字元常量的指標,即指標可以改變指向但其指向的內容不可以改變。 
而char* const相反,指的是常量指標,即指向不可以改變但指標指向的內容可以改變。因此這裡的const char*指向的內容本類是不可以改變的。

那麼這裡為什麼改變了呢?這跟str這個const char*的生命週期及string類的實現有關,string的c_str()返回的指標是由string管理的,因此它的生命期是string物件的生命期,而string類的實現實際上封裝著一個char*的指標,而c_str()直接返回該指標的引用,因此string物件的改變會直接影響已經執行過的c_str()返回的指標引用。

看下官方說法:

const charT* c_str() const;
Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements equal the corresponding elements of the string controlled by *this and whose last element is a null character specified by charT().
Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the returned value as a valid pointer value after any subsequent call to a non-const member function of the class basic_string that designates the same object as this.
  • 1
  • 2
  • 3

簡而言之,呼叫任何 std::string 的非 const 成員函式以後,c_str() 的返回值就不可靠了。


相關推薦

C語言輸出string方法c_str()用法

原文地址 https://blog.csdn.net/crazyspopcorn_qian/article/details/41926953 今天突然用printf("%s",str);//str  是一個string 的時候突然出現亂碼,就查了一下為什麼。任何時候只有自

【STL】stringc_str()、data()函式的用法

標準庫的string類提供了3個成員函式來從一個string得到c型別的字元陣列:c_str()、data()、copy(p,n)。1. c_str():生成一個const char*指標,指向以空字元終止的陣列。注: ①這個陣列的資料是臨時的,當有一個改變這些資料的成員函

stringc_str()的用法

1.語法:1 const char *c_str();c_str()函式返回一個指向正規C字串的指標常量, 內容與本string串相同。這是為了與c語言相容,在c語言中沒有string型別,故必須通過string類物件的成員函式c_str()把string 物件轉換成c中的字

stringc_str()函式的用法

c_str()生成一個const char*指標,指向以空字元終止的陣列。 需要注意的是,這個陣列的資料是臨時的,加入這些資料被改變或者呼叫之後,其中資料就會失效。舉個例子: const char* temp; string s="1234"; c=s.c_str(); c

Stringc_str()、data()、copy(p,n)函式的用法

轉載自;http://blog.csdn.net/u010781856/article/details/46593625string.c_str是Borland封裝的String類中的一個函式,它返回當前字串的首字元地址。c_str函式的返回值是const char*的,不能直接賦值給char*,所以就需要我

c++c_str()用法

c語言 string 沒有 對象 https clas con lan rcp string c="abc123"; char *d=new char[20]; strcpy(d,c.c_str()); cout<<"c:"<<c<<e

c++ stringc_str()與data()用法

#include <string> #include <iostream> int main( )  {    using namespace std;    string  str1 ( "Hello world" );    cout <

C++string型別求長度用法以及c_str用法總結

1.C++中求string型別的長度有三種方式。在c++中,string代表一個類,有它自己的建構函式和成員函式。有兩個成員函式都可以求string型別的長度。①  length()成員函式。②  size()成員函式。③  可以藉助strlen函式,但是前提是需要將stri

標準C++string類的用法總結

也有 www. empty capacity 技術 第一個 stream 一次 jpg 相信使用過MFC編程的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CString類使用起來真的非常的方便好用。但是如果離開了MFC框架,還有沒有這樣使用起來非常方便

標準C++string類的用法總結(轉)

spa 大小 它的 world 包括 文本 語法 ner append() 轉自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用過MFC編程的朋友對CString這個類的印象應該

Booststring的regex用法

標頭檔案 boost/algorithm/string/regex.hpp 作用 string的regex有如下API find_regex:查詢字串str中第一次滿足 regex的子串,返回子串起始,終止位置。 replace_regex:查詢字串str中第一次滿足 regex

Booststring的split用法

標頭檔案 boost/algorithm/string/split.hpp 作用 string的split包括如下API find_all:在字串string str中查詢string sub,返回找到的所有的 sub。 ifind_all:在字串string str中查詢str

Booststring的查詢用法

標頭檔案 boost/algorithm/string/find.hpp 作用 string的查詢有如下API find_first,在大字串中查詢子串第一次出現時,返回 子串在大串的位置。 ifind_first,在大字串中查詢子串第一次出現時,並且忽略大小,返回 子串在大串的

《隨筆十九》—— C++的 “ 標準 C++ string 類的用法總結 ”

目錄 string 類的建構函式 string 類的字元操作 string的特性描述 string類的輸入輸出操作 string的賦值 string的連線 string的比較 string的子串 string的交換 string類的查詢函式 strin

關於javastring類的用法

String類代表字串 字串是常量,他們的值在建立之後不能改變 String類包括的方法有:檢查序列的單個字元;比較字串;搜尋字串;提取子字串;建立字串副本(在該副本中,所有的字元都被轉換為大寫或小寫形式)。 Java語言提供對字串串聯符號(“+”)和其他物件到

JAVAString.format的用法

6.對日期型別進行格式化:         以下日期和時間轉換的字尾字元是為 't' 和 'T' 轉換定義的。這些型別相似於但不完全等同於那些由 GNU date 和 POSIX strftime(3c) 定義的型別。提供其他轉換型別是為了訪問特定於 Java 的功能(如將 'L' 用作秒中的毫秒)。 以下轉

c++c_str()的用法詳解

//標準庫的string類提供了三個成員函式來從一個string得到c型別的字元陣列 //主要介紹c_str //c_str():生成一個const char*指標,指向以空字元終止的陣列。 //這個陣列應該是string類內部的陣列 #include <iostre

沒有躲過的坑--stringc_str()陷阱

string.c_str是Borland封裝的String類中的一個函式,它返回當前字串的首字元地址。 c_str函式的返回值是const char*的,不能直接賦值給char*,所以就需要我們進行相應的操作轉化。 #include <iostream

標準C++string類的用法總結[轉載]

原文地址 相信使用過MFC程式設計的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CString類使用起來真的非常的方便好用。但是如果離開了MFC框架,還有沒有這樣使用起來非常方便的類呢?答案是肯定的。也許有人會說,即使不用MFC框架,也可以想辦法使用MFC中的API,