1.8 字符指針和字符串處理
在C++中,字符串既可以通過字符數組來存取,也可以通過字符指針來操作
字符指針
- 字符指針:定義一個指針時,指定的類型是
char *
- 格式:
char *<指針名1>[,*<指針名2>,...];
- 初始化:通過字符串常量或一維字符數組
- 字符串常量:字符串常量有一個地址,因而它可以賦給一個字符指針變量
- 一維字符數組:字符數組名就是一個指向字符串的指針常量.
char *p1 = "Hello";
char *p2;
p2 = "Hello";
char *p1,str[] = "Hello";
p1 = str;
- 字符串常量和字符數組來初始化字符指針在本質上是不同的,主要體現在:
- 在有點編譯系統中,相同的字符串常量的地址可能是相同的,但相同字符串內容的兩個字符數組的地址一定不同
- 在大多數編譯系統中(如Visual C++)中,字符串常量所在的是常量區,其內存空間的內容在程序運行時是不可修改的,而字符數組的內存空間的內容是可修改的
// 字符串逆序輸出
#include <iostream>
using namespace std;
int main()
{
char *p1 = "ABCDEFG", *p2 = p1;
while (*p1 != '\0')
p1++; //將指針指向字符常量最後的結束符
while (p2 <= p1--)
cout << *p1;
cout << endl;
system("pause");
return 0;
}
帶參數的main函數
- 格式:
數據類型 main(int argc,char * argv[])
- 第一個參數:int,用來存放命令行參數的個數 +1(可執行文件名字)
- 第二個參數:argv是一個一維的指針數組,用來存放命令行中各個參數和命令字(可執行文件名)的字符串,且規定:
argv[0]存放命令字
argv[1]存放命令行中第一個參數
argv[2]存放命令行中第二個參數
… - 這裏的argc的值和argv[]各個元素的值都是系統自動賦給的
//處理命令行參數
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout << "這個程序的程序名是 " << argv[0] << endl;
if (argc <= 1)
{
cout << "沒有參數";
}
else
{
int nCount = 1;
while (nCount < argc)
{
cout << "第" << nCount << "個參數是: " << argv[nCount] << endl;
nCount++;
}
}
system("pause");
return 0;
}
編譯連接後,找到該源程序的.exe,然後切換到DOS命令進行測試
字符串處理函數
C++提供了若干個字符串處理函數,放在string.h頭文件中
1.strcat
和strncat
strcat
是”string(字符串) catenate(連接)”的簡寫,其作用是**將兩個字符串連接起來,形成一個新的字符串:
char *strcat(char *dest,const char *src);
將第二個參數src指定的字符串連接到由第一個參數dest指定的字符串的末尾.成功返回執行dest內存空間的指針,失敗返回NULL
char s1[50] = "good ";
char s2[] = "morning";
strcat(s1,s2);
cout << s1;
//結果輸出 good morning
dest
指向的內存空間必須足夠大,且是可寫的(即不能是字符串常量或const字符指針),以便能存下連接的新字符串.- 兩個字符串開始都有’\0’,但是連接的時候,
dest
後面的’\0’會被清除 - 在string.h頭文件,還有一個
strncat
函數:
char *strncat(char *dest,const char *src,size_t maxlen);
maxlen
參數限定了連接到dest
的字符串src
的最大字符個數
char s1[50] = "good ";
char s2[] = "morning";
strncat(s1,s2,3);
cout << s1;
//結果爲 good mor
2.strcpy
和strncpy
- 函數
strcpy
是”string copy”(字符串複製)的簡寫,用於字符串的”賦值”.
char *strcpy(char *dest,const char *src);
將第2個參數src指定的字符串複製到第一個參數dest指定的內存空間,包括結尾的字符串結束符’\0’.成功返回指定dest內存空間的指針,失敗返回NULL
char s1[50];
char s2[] = "word";
strcpy(s1,s2);
cout << s1;
//結果輸出 word
- 注意:
- 複製是內存空間的寫入操作,因而需要dest所指向的內存空間足夠大,且內存空間是可寫入的,以便能容納被複制的字符串src.注意:dest所指向的內存空間的大小至少是src字符個數+1,因爲結尾還有一個結束符’\0’
- 不能試圖通過指針的指向改變來複制字符串
- 可以使用
strncpy
函數來限制被複制的字符串src的字符個數
char *strncpy(char *dest,const char *src,size_t maxlen);
maxlen
用來指定被複制字符串src的最大字符個數(不包含’\0’)
char s1[50];
char s2[]="word";
strncpy(s1,s2,2);
cout << s1;
// 結果 wo
3.strcmp
和strncmp
strcmp
是”string compare”(字符串比較)的簡寫,用於兩個字符串的比較
int strcmp(const char *s1,const char *s2);
- s1=s2:返回0
- s1>s2:返回一個正整數
- s1