C++ string中c_str()、data()、copy(p,n)函數的用法

2021-03-02 程式設計師數學之美

來自:csqlwy - 博客園

連結:www.cnblogs.com/qlwy/archive/2012/03/25/2416937.html(點擊尾部閱讀原文前往)

標準庫的string類提供了3個成員函數來從一個string得到c類型的字符數組:c_str()、data()、copy(p,n)。

1、c_str():生成一個const char*指針,指向以空字符終止的數組。

註:

①這個數組的數據是臨時的,當有一個改變這些數據的成員函數被調用後,其中的數據就會失效。因此要麼現用先轉換,要麼把它的數據複製到用戶自己可以管理的內存中。注意。看下例:

const char* c;   string s="1234";   c = s.c_str();    
cout<<c<<endl; s="abcd";   cout<<c<<endl;

上面如果繼續用c指針的話,導致的錯誤將是不可想像的。就如:1234變為abcd

其實上面的c = s.c_str(); 不是一個好習慣。既然c指針指向的內容容易失效,我們就應該按照上面的方法,那怎麼把數據複製出來呢?這就要用到strcpy等函數(推薦)。

char* c=new char[20];   string s="1234";   strcpy(c,s.c_str());   cout<<c<<endl; s="abcd";   cout<<c<<endl;

注意:不能再像上面一樣①所示了,const還怎麼向裡面寫入值啊;也不能②所示,使用了未初始化的局部變量「c」,運行會出錯的 。

② c_str()返回一個客戶程序可讀不可改的指向字符數組的指針,不需要手動釋放或刪除這個指針。

2、data():與c_str()類似,但是返回的數組不以空字符終止。

3、copy(p,n,size_type _Off = 0):從string類型對象中至多複製n個字符到字符指針p指向的空間中。默認從首字符開始,但是也可以指定,開始的位置(記住從0開始)。返回真正從對象中複製的字符。-用戶要確保p指向的空間足夠保存n個字符。

#include <string>  
#include <iostream>  
int main( )   {      using namespace std;      string str1 ( "1234567890" );      basic_string <char>::iterator str_Iter;      char array1 [ 20 ] = { 0 };      char array2 [ 10 ] = { 0 };      basic_string <char>:: pointer array1Ptr = array1;      basic_string <char>:: value_type *array2Ptr = array2;      cout << "The original string str1 is: ";      for ( str_Iter = str1.begin( ); str_Iter != str1.end( ); str_Iter++ )          cout << *str_Iter;      cout << endl;      basic_string <char>:: size_type nArray1;              nArray1 = str1.copy ( array1Ptr , 12 );      cout << "The number of copied characters in array1 is: "          << nArray1 << endl;      cout << "The copied characters array1 is: " << array1Ptr << endl;      basic_string <char>:: size_type nArray2;              nArray2 = str1.copy ( array2Ptr , 5 , 6  );      cout << "The number of copied characters in array2 is: "          << nArray2 << endl;      cout << "The copied characters array2 is: " << array2Ptr << endl;                                  }

上面最後注釋掉的部分,雖然編譯沒有錯誤,但是運行時會產生錯誤:Stack around the variable 'array3' was corrupted.

●本文編號114,以後想閱讀這篇文章直接輸入114即可。

●輸入m可以獲取到文章目錄

Linux學習

推薦15個技術類公眾微信

涵蓋:程序人生、算法與數據結構、黑客技術與網絡安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

相關焦點

  • c++中的string常用函數用法總結
    String類的構造函數和析構函數如下:a)      string s;    //生成一個空字符串sb)      string s(str) //拷貝構造函數 生成str的複製品c)      string s(str,stridx) //將字符串str內「始於位置stridx」的部分當作字符串的初值d)      string s(str,stridx,strlen
  • 在C++中將string轉換為char數組
    convert std::string to char[] or char* data type』。輸入 : string s = "linuxmi" ;輸出 : char s[] = { 'l', 'i', 'n', 'u', 'x', 'm', 'i' } ;輸入 : string s = "python" ;輸出 : char s[] = { 'p', 'y', 't', 'h', 'o', 'n' } ;一種方法是將string
  • C語言字符串函數strcat | strcpy | strlen | strcmp的用法及原型
    strcat(str1,str2) 意為將字符串str2連接到字符串str1之後strcat用法如下#include <stdio.h>#include <string.h>輸出結果為TheOne 如果懷疑strcat函數本身發揮作用的話可以將調用的函數名稱改成strcate之類的 結果也一樣哦 來 試試看~strcpy的用法及原型strcpy(str1,str2)是將字符串str2複製到str1中去。
  • c語言中的字符串操作函數
    一,常量指針與指針常量先來補充一個上篇文章 手把手教你深入理解c/c++中的指針 我在講述指針中的一個問題,有人說常量指針與指針常量這兩個概念總是混淆怎麼辦,例如:int a = 100;const int * p = &a;  int const * p = &a;
  • C語言中的字符串操作函數
    我們知道,c/c++之所以使用起來靈活,很大原因歸因於它能夠它對能夠對內存的直接操作,所以本文我主要講述一下c中的字符串操作函數。一,常量指針與指針常量先來補充一個上篇文章 手把手教你深入理解c/c++中的指針 我在講述指針中的一個問題,有人說常量指針與指針常量這兩個概念總是混淆怎麼辦,例如:int a = 100;const int * p = &a;  int const * p = &a;
  • 標準 C++ 中的 string 類的用法總結
    現將具體用法的一部分羅列如下,只起一個拋磚引玉的作用吧,好了,廢話少說,直接進入正題吧!string和wstring的用法是一樣的,以下只用string作介紹:string 類的構造函數:string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n個字符c初始化此外,string類還支持默認構造函數和複製構造函數
  • C++ folly庫解讀(一) Fbstring —— 一個完美替代std::string的庫(下)
    ();}// In C++11 data() and c_str() are 100% equivalent.const Char* data() const { return c_str(); }const Char* c_str() const {    const Char* ptr = ml_.data_;    // With this syntax, GCC and Clang generate a CMOV instead of a branch.
  • c++ fstream + string處理大數據
    (2)應用java的原因是java裡面的map非常靈活,eclipse編譯器更是給力,而且ctrl可以追蹤函數等,詳見java map的排序(3)應用java的另一個原因是java裡面的string類的字符串處理非常靈活,各種函數是應用盡有。
  • C語言strcmp和strcpy的用法
    #include <string.h>int main(void){ char *p="aBc"; char *q="Abc"; char *h="abc"; printf("strcmp(p,q):%d\n",strcmp(p,q)); printf("strcmp
  • C/C++中字符串常量的不相等性及字符串的Copy
    ,但在c/c++卻不是這樣。";        }        else        {            cout<<"不相等";        }      cin.get();  }  strcmp()的函數原形是,int strcmp(const char* str1,const char* str)   相當將會返回一個等於
  • C++ string 類詳解
    C 風格字符串的處理可以參考 https://www.cnblogs.com/tongye/p/10688941.html ,本文著重介紹 string 類庫的使用。一、string 類簡介C++ 中提供了專門的頭文件 string(注意不是 string.h,這個是 C 風格字符串相關函數的頭文件),來支持 string 類型。
  • c++11新特性,所有知識點都在這了!
    sizeofc++11中sizeof可以用的類的數據成員上,看代碼:c++11前:struct A { int data[10]; int a;};int main() { A a;<< "size " << sizeof(A::data) << endl; return 0;}想知道類中數據成員的大小在c++11中是不是方便了許多,而不需要定義一個對象,在計算對象的成員大小。
  • STL string容器用法
    拷貝構造函數:string(const string &str);//構造一個與str一樣的string。如string s1(s2)。帶參數的構造函數string(const char *s);   //用字符串s初始化string(int n,char c);   //用n個字符c初始化string的存取字符操作
  • Go 中 string 轉 []byte 的陷阱
    } else { b = rawbyteslice(len(s)) } copy(b, s) // s是空字符串,複製過去也是長度0 return b}那為什麼不是走 else 中 rawbyteslice 函數?
  • C/C++ 文件操作
    ifs.is_open()) { cout << "文件不存在" << endl; return; } Person p; ifs.read((char*)&p, sizeof(Person)); cout << "name = " << p.m_Name << " ,age = " << p.m_Age
  • 學習C/C++(14)-C++中string類的實現
    : char *data; //字符串 size_t length; //長度};注意,類的成員函數中,有一些是加了const修飾的,表示這個函數不會對類的成員進行任何修改。String::String(const String &str)//拷貝構造函數{ length = str.size(); data = new char[length + 1]; strcpy(data, str.c_str());}析構函數需要進行內存的釋放及長度的歸零。
  • C語言字符串操作總結
    strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定長度字符串 strlen(p) 取字符串長度 strcmp(p, p1) 比較字符串 strcasecmp忽略大小寫比較字符串strncmp(p, p1, n) 比較指定長度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p,
  • C/C++ 筆試、面試題目大匯總
    答案:String::String(constchar*str){if ( str == NULL ) // strlen在參數為NULL時會拋異常才會有這步判斷{m_data =newchar[1] ;m_data[0] ='\0' ;}else{m_data =newchar[strlen(str
  • C/C++字符串操作的全面總結
    總結一下構建string對象方法、修改string對象的方法、string類型的操作函數、string類型的查找、string對象的比較。首先,為了在我們的程序中使用string類型,我們必須包含頭文件 。如下: 這樣我們就聲明了一個字符串變量,但既然是一個類,就有構造函數和析構函數。
  • [精進C++]C++處理字符串常用方法
    int main() { //find() 函數作用於普通數組 char stl[] ="http://c.biancheng.net/stl/"; //調用 find() 查找第一個字符 'c' char * p = find(stl, stl + strlen(stl), 'c'); //判斷是否查找成功 if (p !