1. 程式人生 > >關於c++中字串的相關處理

關於c++中字串的相關處理

前幾天在做網路通訊時,遇到一個小問題,裡面有一個要把字串轉化為字元指標的需求。
C語言中的字元指標其實相當於c++中的string,只不過c++把它封裝了而已。

char *a="abcd";///自動開闢了存放5個字元的記憶體空間
string b=a;///把指標變數a的首地址賦值給了b的首地址(因為string是c++的型別,所以該表示式只在c++中可行,c中不可行,C語言中沒有string類)

這樣做不會出現錯誤,把指標變數a的首地址賦值給了b的首地址。在c++中,字串在記憶體的儲存方式就是和字元指標的儲存方式一樣的。但如果你要複製給一個字元陣列就不對了,如

char *a="abcd"
;///字元指標變數,地址是變數 char b[5];///字元陣列,地址是常量 b=a;///錯誤,常量不能被賦值

因為b在此處是一個常量,表示的是一個地址,常量是不能被賦值的。
但是如果這樣複製卻是可以的

char b[5]="abcd";

這相當於對字元陣列初始化,這是c語言中字元陣列初始化的方式。
字元陣列與字串的區別是,字元陣列的大小是固定的,超過字元陣列的大小則不能初始化,只能初始化比陣列小的字串。而字串則不受大小限制。
一個變數前加上“*”僅僅代表該變數是一個指標變數,變數值為地址。

在c++字串類中有一個成員函式c_str(),這個函式可以把字串轉為為字元指標,但是最後轉化成的字元指標是const char* 型別的,如果你直接這麼賦值會出現錯誤:
string test_str="abcd";
char* a=new char[256];///定義字元指標時一定要開闢記憶體空間,否則程式容易崩!
a=test_str.c_str();

這是因為兩邊的型別不匹配。要把字串轉為字元指標程式碼如下:

///字串轉為字元指標
char* str_to_c(string& s)
{
    char *result = &s[0];
    for (int i = 1; i < s.length() + 1; i++)
    {
        *(result + i) = s[i];
    }

    return
result; }

總結下指標和陣列的區別:
以字元陣列為例簡單說明下陣列與指標之間的區別:
char a[3];
char *b;
const char *c;
string d;
相同點:a,b,c,d都表示的是地址;
不同點:
(1). a[3]只能放三個字元資料,*b則不受大小限制,可以存放許多字元變數;*c也不受大小限制,與*b的區別是b的值能改變,但c的值不能改變。d也不受大小限制,和b基本相同;
(2). a 是常量,b 是變數,c 是常量,d是變數。常量不能被賦值,變數能被賦值;b 和c 的區別是b 能通過指標變數所指向地址的變化來改變其變數的值,但c不能。

c++中string轉int

string str="12345"; 
int b=atoi(str.c_str());

將int轉化為string

int n;
char buffer[4];
sprintf_s(buffer, "%d", n);
string str = buffer;

c++中string轉double

string str="123.45"; 
double b=atof(str.c_str());

double轉string

double f0=123.456;
char buffer[12];
sprintf_s(buffer, "%f", f0);
string str = buffer;

提供基於boost庫的字串相關處理:

#include <boost/lexical_cast.hpp>
using namespace boost;
int main()
{
try
{
int x= lexical_cast<int>("100");///字串->整型
long y=lexical_cast<long>("2000");///字串->長整型
float pai=lexical_cast<float>("3.14159e5");///字串->float
double e=lexical_cast<double>("3.141592654");///字串->double
string str=lexical_cast<string>("456");///整型->string
string str2=lexical_cast<string>("0.456");///浮點型->string
}
catch(bad_lexical_cast& e)
{
cout<<"error: "<<e.what()<<endl;
}

return 0;
}

相關推薦

關於c++字串相關處理

前幾天在做網路通訊時,遇到一個小問題,裡面有一個要把字串轉化為字元指標的需求。 C語言中的字元指標其實相當於c++中的string,只不過c++把它封裝了而已。 char *a="abcd";///自動開闢了存放5個字元的記憶體空間 string b=a

C#字串相關操作

1.Replace(替換字元): public string Replace(char oldChar,char newChar);在物件中尋找oldChar,如果尋找到,就用newChar將oldChar替換掉。 如:             string st = "ab

C++字串處理函式

一、C++中substr函式的用法#include<string> #include<iostream> using namespace std; main() { string s("12345asdf"); string a=s.substr(0

C的檔案處理相關知識

最近在寫資料結構的實驗時,要用到儲存和讀取文字檔案的操作,於是我回顧了一下在上個學期學習C++檔案處理的時候,我用到的是建立檔案類,建立物件對檔案進行操作。 而C對檔案的操作核心上離不開指標的運用。 C++操作是對物件的操作,因此首先應該建立寫檔案流的物件,即ofstre

C#字串含有\0的問題處理

問題描述 在byte轉換為字串的過程中,如果byte的值為0,則轉換成字串時變為’\0’字元,’\0’字元在C#中意味著字串結束,如果後面再有字元,則讀取字串的程式也不能讀取和顯示出來。 如下圖所示,構造一個位元組陣列,其中含有’\0’字元,在程式執行時通過跟蹤可以看出:

cc++字串處理函式strtok,strstr,strchr,strsub

函式原型:char *strtok(char *s, char *delim); 函式功能:把字串s按照字串delim進行分割,然後返回分割的結果。 函式使用說: 1.strtok函式的實質上的處理是,strtok在s中查詢包含在delim中的字元並用NULL(’/0′)來替換,直到找遍整個字串。這句

C#】淺析C#的日期處理

see var time tostring 靈活性 ide format tin 介紹 1.字符串轉化為日期 1.1第一種方式 使用 Convert.toDateTime 方法,該方法有很多重載方法,這裏筆者就介紹兩個常用的重載方法。 第一種: 使用: Con

C#全局處理異常方式

提示 ebo 方式 ren 程序 sender exception += settings using System; using System.Configuration; using System.Text; using System.Windows.Forms; u

C++路徑的處理方法(string)

ble fin ase names 復制字符串 ostream 是否 substr() 新的 string 類提供字符串處理函數,利用這些函數,程序員可以在字符串內查找字符,提取連續字符序列(稱為子串),以及在字符串中刪除和添加。我們將介紹一些主要函數。 1.函數find_

C++字串後面如何新增整形變數

直接上程式碼: #include "stdafx.h" #include"iostream" using namespace std; void main() { string Name = "數字是"; for (int i = 0; i < 10; i++) { cha

【第9天】Java字串處理

1 String類的初始化、與StringBuffer類和StringBuilder類三者的區別 1.1 String類的初始化兩種方式 1.2 String類、StringBuffer類和StringBuilder類三者的區別

關於C++字串是否可以比較大小的問題

C++中字串分兩種,一種是C語言的字串,一種是string字串。 C語言字串是不可以直接比較大小的,string是可以直接比較大小的。   具體細節: C語言的字串的實質是一個字元陣列中儲存的字元序列,如果直接比較大小相當於比較了兩個字串的首地址的大小,毫無意義。 C語言的字

C++筆記 第六十五課 C++的異常處理(下)---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第六十五課 C++中的異常處理(下) 1.C++中的異常處理 catch語句塊中可以丟擲異常 2.問題 為什麼要在catch中重新丟擲異常? 3.C++中的異常

C++筆記 第六十四課 C++的異常處理(上)---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第六十四課 C++中的異常處理(上) 1.C++異常處理 C++內建了異常處理的語法元素try…catch… try語句處理正常程式碼邏輯 catch語句處理異常情況 try

C語言字串高階處理(三)strspn,strcspn,strtok

高階字串查詢 strspn():函式返回字串STR1中第一個不包含於字串STR2的字元的索引或者理解為STR1包含STR2任一字元的字元長度。 strcspn():函式返回STR1開頭連續Ñ個字元都不含字串STR2內字元的字元數或者理解為STR1不包含STR2任一字元的字元長度。 的

二維陣列求每名學生的總成績和平均成績(c++字串的輸出)

#include “stdafx.h” #include #include //可以輸出字串 using namespace std; int main() { int scores[3][4]; cout << “請輸入同學姓名以及成績!”<

#Python字串處理方法例項詳解

字串的處理方法 1.eval(str) 功能:將字串str當成有效的表示式來求值並返回計算結果。 num1 = eval("123.1") print(num1) #(輸出)123.1 print(type(num1)) #(輸出)<class

C/C++字串常量為什麼可以賦值給char*?

1、對於C來說,字串常量是由字元構成的陣列,比如“hello”型別為char[6],所以在C中可以直接字串常量賦值給char*。既然C中字串常量是是不是改變字串常量的值呢?答案是否定的,雖然可以編譯通過(會有警告),但是執行時會出錯。因為字串常量位於只讀儲存區不允許寫操作。實驗如下: #incl

C++字串拼接、十六進位制轉十進位制

txt檔案如下: 檔案說明:檔案中為十六進位制資料。 實現:先進行字串拼接,然後進行十六進位制轉十進位制。 字串拼接程式碼: //字串拼接 infile>>string1>>string2; string1=string1+string2

C語言字串常用處理技巧總結

1.從一串字串中提取中間一段,並單獨拿出來 char *pStart = NULL,*pMid = NULL,*pEnd = NULL,*t = NULL; pStart= strstr(pStart, "A"); pEnd = strstr(pStart, "