字符和整数的转化
常用ASCII值
特殊值:A - Z 是 65~ 92,a - z 是 97~ 122,0 - 9 是 48~ 57,空格是 32,'\0'是 0。
强制转换:
char c = 'a';
cout << (int)c << endl; // 同理 (char)97 将97转换成a
字符数组
字符串就是字符数组加上结束符 '\0'
可以使用 字符串 来初始化 字符数组,但此时要注意,每个字符串结尾会暗含一个 '\0'字符,因此字符数组的长度至少要比字符串的长度多 1
char a[6] = "hello"; // 空间为6
读入字符数组
注意:scanf 和 cin 都是读到 空格 或 回车 为止
输入
- 读入字符数组时,
scanf("%s", s);无须加取址符号&,因为变量s本身就是个地址。 - 输入也可以用
cin >> s; - 如果想读到从下标 1 开始的话,写成
scanf("%s", s + 1);
输出
- 可以用
cout << s; - 也可以写成
printf("%s\n", s); - 还可以写成
puts(s) ;// puts(s) 等于 cout << s << endl; - 如果想从下标 1或2 开始,则写成
cout << s + 1;(从下标1开始输出) 或printf("%s\n", s + 1);
// 字符数组 vs 字符
char str[31]; //字符数组
scanf("%s", str); //不要加取址符&
char c; //字符
scanf("\n%c", &c); //过滤掉回车
读入一整行
(1) 字符数组 用 fgets 或 cin.getline 输入;输出也可以用 puts
这里的 stdin 是把标准读入当成文件来读入。
输出除了用 printf 也可以用 puts,等价于 printf("%s\n", s); 它会自动补上换行符
fgets 输入会自动加上回车,所以用 puts(输出自带回车) 的话会多一个回车
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
char s[100];
fgets(s, 100, stdin); //stdin 把终端当文件读入
cin.getline(s, 100);
cout << s << endl;
printf("%s", s);
puts(s); //等价于 printf("%s\n", s); 包括换行符
return 0;
}
字符串 用 getline(cin, s); 输入
如果是整行 string 类型的字符串,则用 getline() 来输入
string s;
getline(cin , s);
如果是单个 string 类型,用cin读入,不能用 scanf 读入
字符数组的常用操作
下面几个函数需要引入头文件:
#include <cstring>
- (1) strlen(str),求字符串的长度,只计算字符串的元素,\0不计入其中
- (2) strcmp(a, b),比较两个字符串的大小,ab返回 1。这里的比较方式是字典序!
- (3) strcpy(a, b),将字符串 b 复制给从 a 开始的字符数组。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
char s1[100] = "hello world!", s2[100];
cout << strlen(s1) << endl;
strcpy(s2, s1); // 把后者复制给前者
cout << strcmp(s1, s2) << endl;
return 0;
}
遍历字符数组中的字符
注意:如果没先存 len 而写成 i < strlen(a),那么就两重循环了。 因为strlen()函数时间复杂度是$O(n)$。
int main()
{
char a[100] = "hello world";
for (int i = 0, len = strlen(a); i < len; i++)
cout << a[i] << endl;
return 0;
}
字符数组与整数转换
- stoi(str); //将字符串转换成数字
- atoi(str.c_str()); //将字符数组转换成数字
标准库类型 string
可变长的字符序列,可以动态分配,比字符数组更加好用。需要引入头文件:
#include <string>
可将两个字符串拼接在一起
string 上的操作
不能用 scanf("%s", &s1) 来读入 string,这是错的;只能用 cin 来读入 不能用 printf 直接输出 string,需要写成:
printf(“%s”, s.c_str()); //或 puts(s1.c_str());
c_str() 返回的是字符数组的首地址
使用 getline 读取一整行
string 的 empty 和 size 操作。size()是 O(1) 复杂度,strlen() 是 O(n)的复杂度。
字面值和 string 对象相加
做加法运算时,字面值和字符都会被转化成 string 对象,因此直接相加就是将这些字面值串联起来
substr(pos, count) 的用法
- substr(pos, count)函数:
- pos - 要包含的首个字符的位置
- count - 子串的长度 返回含子串 [pos, pos+count) 的 string
fgets() 与 cin.getline() 的区别
用 fgets() 输入字符数组时,还要记得去掉末尾回车
用 cin.getline() 输入字符数组时,不用做这步操作
sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是一个 IO流一样。
istringstream 从 string 读取数据
ostringstream 向 string 写入数据
头文件 stringstream 用于读写给定 string 的字符串流,既可从 string 读数据也可向 string 写数据
int main(){
int a,b,c;//double a,b,c;//也可以
cin >>a >> b >> c;//输入 1 2 3
stringstream s;
s << a << b << c;//拼接
string x,y,z;
s >> x ;
// 设置8位宽度 前面补0
cout << setw(8) << setfill('0') << x ;// 输出 00000123
return 0;
}
/*
1.2 2 3
0001.223
*/
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com