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