C/C++字符串

C/C++字符串

C++提供两种类型的字符串表示形式:

1. C-风格字符串
2. C++引入的string类类型

C-风格字符串

1.字符

字符是用单引号 ’ ’ 括起来的单个普通字符或转义字符。

char c='A';
char op='\n';

关于转义字符:
在这里插入图片描述

2.字符串

在 C 语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的“一维字符数组”(本质!)。

char str[6]={'H','e','l','l','o','\0'};

数组的末尾存储空字符,所以字符数组的大小比字符串长度+1;
也可以写成:

char str[]="Hello";

在这里插入图片描述

输入方式:
char str[100];
cin >> str;  //read a word;
cin.getline(str,100);  //read a line, discard \n
cin.get(str,100);  //read a line, leave \n in queue

在这里插入图片描述

常用函数:

字符串长度strlen()

原型:
*size_t strlen(const char s);
功能: 给一个字符串的起始地址s,不断往后计算,直到遇到\0为止就停止计算!
返回值:s指向的字符串对应的字符个数

字符串连接函数strcat()

strcat 是 string catenate 的缩写,意思是把两个字符串拼接在一起,语法格式为:

strcat(arrayName1, arrayName2);

arrayName1、arrayName2 为需要拼接的字符串。
strcat() 将把 arrayName2 连接到 arrayName1 后面,并删除原来 arrayName1 最后的结束标志'\0'。这意味着,arrayName1 必须足够长,要能够同时容纳 arrayName1 和 arrayName2,否则会越界(超出范围)。
strcat() 的返回值为 arrayName1 的地址。

#include<iostream>
using namespace std;
int main()
{
 char str1[30] = { "Hello " };
 char str2[10] = { "world!" };
 strcat(str1, str2);
 cout << str1 << endl;
 return 0;
}

在这里插入图片描述

附加指定长度字符串strncat
  • 原型:strncat(char target[], const char source[], int numchars);
  • 功能:将字符串source的前numchars个字符接到target的后面
  • 例如:
#include<iostream>
using namespace std;
int main()
{
 char str1[20] = { "Hello " };
 char str2[10] = { "String!" };
 cout << strncat(str1, str2, 3) << endl;
 return 0;
}

在这里插入图片描述

复制字符串strcpy
  • 原型:strcpy(char destination[], const char source[]);
  • 功能:将字符串Source拷贝到字符串destination中
  • 例如:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
 char str1[15] = { "Hello world!" };
 char str2[10] = { "computer" };
 cout << strcpy(str1, str2) << endl;
 return 0;
}

注:在定义数组时,字符数组1的字符串长度必须大于或等于字符串2的字符串长度。不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。
在这里插入图片描述

复制指定长度字符串strncpy
  • 原型:strncpy(char destination[], const char source[], int numchars);
  • 功能:将字符串source中前numchars个字符拷贝到字符串destination中
  • 例如:
#include<iostream>
using namespace std;
int main()
{
 char str1[20] = { "Hello world!" };
 char str2[10] = { "comuter" };
 cout << strncpy(str1, str2, 3) << endl;
 return 0;
}

注:字符串source中前numchars个字符将覆盖掉字符串destination中前numchars个字符
在这里插入图片描述

比较字符串strcmp

原型:int strcmp(const char str1[], const char str2);
功能:比较两个字符串firststring和secondstring
返回值:
1)如果返回值 < 0,则表示 str1 小于 str2;
2)如果返回值 > 0,则表示 str2 小于 str1;
3)如果返回值 = 0,则表示 str1 等于 str2。
eg.

从第一位开始,'c'和'l'比较,当然是'c' < 'l'了,所以,"cds" < "lesoqd" 
strcasecmp 忽略大小写比较字符串

原型:strcasecmp (const char *s1, const char *s2);
功能:比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异
返回:若参数s1和s2字符串相等则返回0。
s1大于s2则返回大于0 的值,
s1 小于s2 则返回小于0的值。

strncmp(p, p1, n) 比较指定长度字符串

原型:strncmp(const char str1[], const char str2, int number)
功能:此函数功能即比较字符串str1和str2的前number个字符
返回:
1)如果返回值 < 0,则表示 str1 小于 str2;
2)如果返回值 > 0,则表示 str2 小于 str1;
3)如果返回值 = 0,则表示 str1 等于 str2。

strchr(p, c) 在字符串中查找指定字符

原型:char *strchr(const char *string, char c);
功能:查找字符串string中首次出现的位置, NULL结束符也包含在查找中.。
返回:返回一个指针, 指向字符c在字符串string中首次出现的位置, 如果没有找到, 则返回NULL.。

#include<iostream>
using namespace std;
int main()
{
 char str[30] = { "Hello world!" };
 char c;
 cout << "请输入要查找的字符:";
 cin >> c;
 if (strchr(str, c) == NULL)
  cout << "查无此字符!" << endl;
 else
  cout << "位置:" << strchr(str, c) << endl;
 return 0;
}

在这里插入图片描述

strrchr(p, c) 在字符串中反向查找

原型:char *strrchr(const char *string, char c);
功能:查找字符c在字符串string中最后一次出现的位置, 也就是对string进行反序搜索, 包含NULL结束符。
返回:返回一个指针, 指向字符c在字符串string中最后一次出现的位置, 如果没有找到, 则返回NULL。

strstr(p, p1) 查找字符串

原型:char *strstr(const char *string, const char *strSearch);
功能:在字符串string中查找strSearch子串.。
返回:该函数返回在 string中第一次出现 strSearch字符串的位置,如果未找到则返回 null。

strpbrk(p, p1)

原型:char *strpbrk(const char *str1, const char *str2)
功能:检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。
返回:str1 中第一个匹配字符串 str2 中字符的字符数,如果未找到字符则返回 NULL。

strspn(p, p1)

原型:size_t strspn(const char *str1, const char *str2)
功能:检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标
返回:字符串 str1 中第一个不在字符串 str2 中出现的字符下标。

string类类型

string类由头文件string支持

#include<string>
string类输入:
string stuff;
cin >> stuff;  //read a word
getline(cin,stuff);  // read a line, discard \n

注意:
两个版本的 getline( ),都有一个可选参数,用于指定使用哪个字符来确定输入的边界:

cin.getline(str,100,':');  //read up to ; ,discard;
getline(stuff,':');  //read up to ; ,discard;

主要区别在于:string版本的getline()将自动调整目标string对象大小,使之刚好能够存储输入的字符。

char fname[10];
string lname;
cin >> fname;  //如果输入的单词字符数大于9会报错
cin >> lname;  //can read a very very long word
cin.getline(fname,10);  //截断输入
cinline(cin,lname);  //不截断

程序清单:

#include<iostream>
#include<string>
using namespace std;
int main()
{
 using namespace std;
 string one("My name is String!");//初始化,C-风格
 cout << one << endl;//使用重载<<运算符显示
 string two(20, '$');//初始化为由20个字符组成的字符串
 cout << two << endl;
 string three(one);//复制构造函数将string对象three初始化为one
 cout << three << endl;
 one += "I love wly.";//附加字符串
 cout << one << endl;
 two = "Sorry!";
 three[0] = 'p';//使用数组表示法访问
 string four;
 four = two + three;
 cout << four << endl;
 char alls[] = "All's well that ends well.";
 string five(alls, 20);//只使用前20个字符
 cout << five << "!\n";
 string six(alls + 6, alls + 10);
 cout << six << endl;
 string seven(&five[6], &five[10]);
 cout << seven << endl;
 string eight(four, 7, 16);
 cout << eight << endl;
 return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树下一朵云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值