火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

第十课 字符串处理

作者: 作者的头像   huolong , 时间:2023-01-15 16:02:59 , 所有人可见, 阅读  14

字符和整数的转化

常用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 都是读到 空格 或 回车 为止

输入
  1. 读入字符数组时,scanf("%s", s); 无须加取址符号 &,因为变量 s 本身就是个地址。
  2. 输入也可以用 cin >> s;
  3. 如果想读到从下标 1 开始的话,写成 scanf("%s", s + 1);
输出
  1. 可以用 cout << s;
  2. 也可以写成 printf("%s\n", s);
  3. 还可以写成 puts(s) ; // puts(s) 等于 cout << s << endl;
  4. 如果想从下标 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

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码