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 <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】string中c_str()、data()函式的用法
標準庫的string類提供了3個成員函式來從一個string得到c型別的字元陣列:c_str()、data()、copy(p,n)。1. c_str():生成一個const char*指標,指向以空字元終止的陣列。注: ①這個陣列的資料是臨時的,當有一個改變這些資料的成員函
string中c_str()的用法
1.語法:1 const char *c_str();c_str()函式返回一個指向正規C字串的指標常量, 內容與本string串相同。這是為了與c語言相容,在c語言中沒有string型別,故必須通過string類物件的成員函式c_str()把string 物件轉換成c中的字
string中c_str()函式的用法
c_str()生成一個const char*指標,指向以空字元終止的陣列。 需要注意的是,這個陣列的資料是臨時的,加入這些資料被改變或者呼叫之後,其中資料就會失效。舉個例子: const char* temp; string s="1234"; c=s.c_str(); c
String中c_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++ string中的c_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這個類的印象應該
Boost中string的regex用法
標頭檔案 boost/algorithm/string/regex.hpp 作用 string的regex有如下API find_regex:查詢字串str中第一次滿足 regex的子串,返回子串起始,終止位置。 replace_regex:查詢字串str中第一次滿足 regex
Boost中string的split用法
標頭檔案 boost/algorithm/string/split.hpp 作用 string的split包括如下API find_all:在字串string str中查詢string sub,返回找到的所有的 sub。 ifind_all:在字串string str中查詢str
Boost中string的查詢用法
標頭檔案 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
關於java中string類的用法!
String類代表字串 字串是常量,他們的值在建立之後不能改變 String類包括的方法有:檢查序列的單個字元;比較字串;搜尋字串;提取子字串;建立字串副本(在該副本中,所有的字元都被轉換為大寫或小寫形式)。 Java語言提供對字串串聯符號(“+”)和其他物件到
JAVA中String.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
沒有躲過的坑--string中的c_str()陷阱
string.c_str是Borland封裝的String類中的一個函式,它返回當前字串的首字元地址。 c_str函式的返回值是const char*的,不能直接賦值給char*,所以就需要我們進行相應的操作轉化。 #include <iostream
標準C++中的string類的用法總結[轉載]
原文地址 相信使用過MFC程式設計的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CString類使用起來真的非常的方便好用。但是如果離開了MFC框架,還有沒有這樣使用起來非常方便的類呢?答案是肯定的。也許有人會說,即使不用MFC框架,也可以想辦法使用MFC中的API,