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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章