1.8 字符指針和字符串處理

1.8 字符指針和字符串處理

在C++中,字符串既可以通過字符數組來存取,也可以通過字符指針來操作

字符指針

  • 字符指針:定義一個指針時,指定的類型是char *
  • 格式:
    char *<指針名1>[,*<指針名2>,...];
  • 初始化:通過字符串常量一維字符數組
    • 字符串常量:字符串常量有一個地址,因而它可以賦給一個字符指針變量
    • 一維字符數組:字符數組名就是一個指向字符串的指針常量.
char *p1 = "Hello";
char *p2;
p2 = "Hello";
char *p1,str[] = "Hello";
p1 = str;
  • 字符串常量和字符數組來初始化字符指針在本質上是不同的,主要體現在:
    1. 在有點編譯系統中,相同的字符串常量的地址可能是相同的,但相同字符串內容的兩個字符數組的地址一定不同
    2. 在大多數編譯系統中(如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.strcatstrncat
  • 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 
  1. dest指向的內存空間必須足夠大,且是可寫的(即不能是字符串常量或const字符指針),以便能存下連接的新字符串.
  2. 兩個字符串開始都有’\0’,但是連接的時候,dest後面的’\0’會被清除
  3. 在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.strcpystrncpy
  • 函數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
  • 注意:
    1. 複製是內存空間的寫入操作,因而需要dest所指向的內存空間足夠大,且內存空間是可寫入的,以便能容納被複制的字符串src.注意:dest所指向的內存空間的大小至少是src字符個數+1,因爲結尾還有一個結束符’\0’
    2. 不能試圖通過指針的指向改變來複制字符串
    3. 可以使用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.strcmpstrncmp
  • strcmp是”string compare”(字符串比較)的簡寫,用於兩個字符串的比較
    int strcmp(const char *s1,const char *s2);
    • s1=s2:返回0
    • s1>s2:返回一個正整數
    • s1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章