程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c字符串,string對象,字符串字面值的差別詳解

c字符串,string對象,字符串字面值的差別詳解

編輯:關於C++

c字符串,string對象,字符串字面值的差別詳解。本站提示廣大學習愛好者:(c字符串,string對象,字符串字面值的差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是c字符串,string對象,字符串字面值的差別詳解正文


1、字符串字面值
字符串字面值是一串常量字符,字符串字面值常量用雙引號括起來的零個或多個字符表現,為兼容C說話,C++中一切的字符串字面值都由編譯器主動在末尾添加一個空字符。
字符串沒有變量名字,本身表現本身

"Hello World!" //simple string literal
"" //empty string literal
"\nCC\toptions\tfile.[cC]\n" //string literal using newlines and tabs

字符字面值: 'A' //single quote:character literal
字符串字面值: "A" //double quote:character string literal.包括字母A和空字符的字符串

字符串字面值的銜接:

std::out << "a multi-line "+
"string literal"+
" using concatenation"
<< std::endl;

輸入:a multi-line string literal using concatenation

多行字面值:

std::out << "a multi-line \n
string literal\n
using a backslash"
<< std::endl;

輸入:a multi-line string literalusing a backslash

=================================================

1. string literal:字符串直接量:

cout<<"hello"<<endl;

代碼中經由過程包括"hello"字符串本身來將其輸入,並未包括該字符串的變量。

2. 字符串直接量可以賦值給變量,然則與字符串直接量相干聯的內存空間位於只讀部門,是以它是常量字符數組。

char* ptr = "hello";
ptr[1] = 'a';//crash! attemps to write to read-only memory.

是以,當援用字符串直接量的時刻應用指向const的字符數組:

const char* ptr = "hello";
ptr[1] = 'a';//bug! attempts to write to read-only memory.

3. 當將字符串直接量賦值給字符數組的初始值的時刻。因為字符數組寄存與棧中,不許可援用其他處所的內存,是以編譯器會將字符串直接量復制到站的數組內存中。是以,可以停止響應的修正。

char stackArray[] = "hello";
stackArray[1] = 'a';

2、C++作風字符串
C++作風字符串:應用C++作風字符串的時刻,要將它當作是一個通俗的類型,如int,如許反而會防止將string作為一個類來懂得所帶來的許多成績。

1. 支撐<cstring>中很多函數完成的異樣操作。
2. 字符串界說:

string myString = “hello”;

3. 操作符 = :復制字符串;好比:

string newone = original;

會將後者復制給前者,不會湧現兩個變量異樣指向一個內存的情形。
4. 可以像int一樣應用 == 之類的操作符
5. 可以轉變字符串中的某一個字符。 如

string myString = "hello"; mystring[0] = 'l';

這中操作是許可的。

2.1 C作風字符串的應用
C++說話經由過程(const) char *類型的指針來把持C作風字符串。

#include <cstring> // cstring是string.h頭文件中的C++版本,而string.h是C說話供給的尺度庫

//把持C作風字符串的尺度庫函數(參數類型省略,都是char *類型):
strlen(s) // 前往s的長度,不包含字符串停止符null
strcmp(s1, s2) //當s1<s2時,前往值<0 ,當s1=s2時,前往值=0 ,當s1>s2時,前往值>0
strcat(s1, s2) // 將字符串s2銜接到s1後,並前往s1
strcpy(s1, s2) // 將s2復制給s1,並前往s1
strncat(s1, s2, n) // 將s2的前n個字符銜接到s1前面,並前往s1
strncpy(s1, s2, n) // 將s2的前n個字符復制給s1,並前往s1
if(cp1 < cp2) // compares address, not the values pointed to
const char *cp1 = "A string example";
const char *cp2 = "A different string";
int i=strcmp(cp1, cp2); // i is positive
i=strcmp(cp2, cp1); // i is negative
i=strcmp(cp1, cp1); // i is zero

2.3 永久不要忘卻字符串停止符null

char ca[]={'C', '+', '+'}; // not null-terminated
cout << strlen(ca) << endl; // disaster: ca isn't null-terminated

2.4 挪用者必需確保目的字符串具有足夠的年夜小

// Dangerous:What happens if we miscalculate the size of largeStr?
char largeStr[16+18+2]; // will hold cp1 a space and cp2
strcpy(largeStr, cp1); // copies cp1 into largeStr
strcat(largeStr, " "); // adds a space at end of largeStr
strcat(largeStr, cp2); // concatenates cp2 to largeStr
// prints A string example A different string
cout << largeStr << endl;

2.5 應用strn函數處置C作風字符串

char largeStr[16+18+2] // to hold cp1 a space and cp2
strncpy(largeStr, cp1, 17); // size to copy includes the null
strncat(largeStr, " ", 2); // pedantic, but a good habit
strncat(largeStr, cp2, 19); // adds at most 18 characters, plus a null

2.6 盡量應用尺度庫類型string

string largeStr = cp1; // initialize largeStr as a copy of cp1
largeStr += " "; // add space at end of largeStr
largeStr += cp2; // concatenate cp2 onto end of largeStr

此時,尺度庫擔任處置一切的內涵治理成績。

3、C作風字符串
字符串字面值的類型本質是const char類型的數組。C++從C說話繼續上去的一種通用構造是C作風字符串,而字符串字面值就是該類型的實例。C作風字符串是以空字符null停止的字符數組:

char ca1[]={'C', '+', '+'}; // no null, not C-style string
char ca2[]={'C', '+', '+', '\0'}; // explicit null
char ca3[]="C++"; // null terminator added automatically
const char *cp="C++"; // null terminator added automatically
char *cp1=ca1; // points to first element of a array, but not C-style string
char *cp2=ca2; // points to first element of a null-terminated char array

ca1和cp1都不是C作風字符串:ca1是一個不帶停止符null的字符數組,而指針cp1指向ca1,是以,它指向的其實不是以null停止的數組。

字符串的銜接:
1.c++中string可以替換c中的char數組且前者用起來更便利。銜接兩個string對象只需用'+';c字符串是用char數組完成的。以下都稱c字符串為char數組

例如:

string s1="hello",s2="world";

          string s3=s1+s2;                  //也能夠s3=s1+"world"

cout<<s3<<endl;//成果為helloworld

固然還可以用+=銜接。

2.還可以如許銜接一個string對象和char數組。

例如:

string s1="hello";

          char s2[]="world";

cout<<s1+s2<<endl;//輸入成果為helloworld

但不克不及如許銜接兩個char數組或字符字面值。

例如:

string s1="hello";

           string s2="world";

           string s3=s1+"world";//准確,可以銜接一個string對象和字符串字面值

           string s4="hello"+"world";//毛病,不克不及如許銜接連個字符串字面值

           char s5[]="world";

           string s6=s1+s5;//准確,可以銜接一個string對象和char數組

           char s7[]="hello";

           stirng s8=s7+s5;//毛病,不克不及如許銜接兩個char數組。

總而言之只能用+或+=銜接兩個string對象或一個string對象和字符串字面值或一個string對象和char數組。

銜接一個string對象和字符串字面值或char數組或前往的都是string對象,所以可以銜接一個string對象和字符串字面值(或char數組)後再銜接一個字符串字面值(或char數組)。

例如:

string s;//初始化為空
char s1[]="hello";
char s2[]="world";
s=s+s1+s2;//准確

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved