一、簡單介紹相關問題
聲明一下,我們從C風格和C++風格來分類討論字符串問題。
首先說一說C語言中的字符數組與字符串它們所表現的不同點問題:
char str[7] = {‘n’,’i’,’h’,’a’,’o’}
char str[5] = {‘n’,’i’,’h’,’a’,’o’}
char str[] = {“nihao”}
char str[] = “nihao”
首先看第一行,數組一共是7個字節的空間大小,實際上有意義的只有5個字符,另外兩個位置無法確定其值。再看第二行,數組正好就是是5個字節的空間大小,沒有後邊的多餘字符。第三行和第四行其實是等價的,只是寫法不同,它們佔用的空間是幾個字節呢?答案是6個,因爲末尾系統自動添加了空字符'/0'。
前兩行是純正的字符數組,而後兩行就是C風格的字符串了,即用字符數組表示字符串。另外,也可以通過指針來定義一個字符串,比如:char * pstr = “nihao”。
再來看看C++語言中字符串相關問題。
C++提供了3中表示C風格字符串的方法:字符數組、字符串常量、字符串指針。他們的類型都是char* (char指針),因此被自動作爲char*類型參數傳遞給函數。字符串函數通過檢測空值字符來確定字符串的結尾。
在C++中我們可以用C風格的字符串,這個是兼容的,並且在<cstring>庫中還提供了很多C風格的字符串操作函數:
字符串複製函數:char *strcpy(char *s,const char ct)
串連接函數:char *strcat(char *s,const char *ct)
字符串比較函數:int strcmp(const char *cs,const char ct)
字符串長度函數:int strlen(const char *s)
除了C風格的字符串,C++還有自己的標準字符串類<string>,比如說string str = “hello”,對應的也提供了很多操作string的函數
另外,注意一下下邊這個:
char name1[20] = "DreamerWay";
cout<<sizeof(name1)<<endl;
cout<<strlen(name1)<<endl;
第一個輸出是20而第二個輸出是10,也就是說sizeof輸出的數組所佔空間大小而strlen輸出的是數組中存儲的字符串的長度。
二、應用(主要針對C風格的字符數組、字符串)
1、字符指針作爲函數的形參
void (char *from, char *to)
{
for(; *form != '\0'; from++, to++)
*to = *from;
*to = '\0';
}
2、字符數組作爲函數的形參
void copy_string(char from[], char to[])
{
int i=0;
while(from[i] != '\0')
{ to[i] = from[i]; i++; }
to[i] = '\0';
}
3、字符輸入輸出
char str[80], *p;
p = gets(str);
puts(p);
puts(str);
4、字符串作爲函數形參
void copy_s(char *str1,char *str2)
{
while((*str2=*str1)!='\0')
{
str1++;
str2++;
}
}