【c++语法】字符串

读入

string r(n, '0');	// 声明一个长度为n,元素全为'0'的字符串

char s[100];
// 到空格、换行等就会结束
scanf("%s", s);
cin >> s;

// 不受空格限制
char s[100];
fgets(s, 100, stdin); // gets函数在新版C++中被移除了,因为不安全; 可以用fgets代替,但注意fgets不会删除行末的回车字符
cin.getline(s, 100);
// 或者  使用getline()读取一整行。
string s;
getline(cin, s);

gets函数存在安全隐患,它不能防止缓冲区溢出,如果输入的字符超过了预期,可能会导致程序崩溃或其他安全问题。所以现在推荐使用fgets代替。

输出

printf("%s\n",s);
cout << s;
// 只能用于char[] s
puts(s);

函数

// 只能计算字符数组,或者s.c_str();返回值的数据类型是size_t,使用前需要int n = strlen(s);
// 如果是字符串s,直接使用s.size()即可返回size_t类型的长度值
// s.size()<=-1永远是true,因为-1会被隐式转换成一个无符号整数(在32位系统中是4294967295,在64位系统中是18446744073709551615)
strlen(s);

// 比较字典序  返回-1 (a < b),0 (a == b),1 (a > b)
strcmp(s1, s2);  

// 复制b给a    // 将字符串b复制给从a开始的字符数组
strcpy(a, b);

// 计算字符串中某个字符的数量 e.g.空格      count在<algorithm>中
int cnt = count(sentence.begin(), sentence.end(), ' ');

string

cin >> s;

// 使用printf打印string需要使用.c_str()
printf("%s", s.c_str());
puts(s);
cout << s;

s.empty();
// O(1)的
s.size();	// 返回值数据类型是size_t
// 当i始终是非负数时,就不会出现问题(因为两者都是非负的)
s.length();

// 截取字符串中的子串
s.substr(4);        // 从下标4开始一直到结束
s.substr(5, 3);     // 从下标5开始,3个字符

// to_string(),stoi(),stod(),stof(),stol(),stoll(),stoul(),stoull()

s.earse(p, n);		// 删除s中从p开始的n个字符,如果n省略就删到底O(n)

s1.find(s2, pos);	// 从pos位置开始,查找成功时返回第一次出现的下标,失败返回string::npos的值(-1)
s1.rfind(s2, pos);	// 从pos开始从后向前查找字符串s2中字符串在当前串后边第一次出现的下标

s1.replace(p, len, s2, pos, len);	// 将从p开始的len个字符替换为s2从pos开始的len个字符,后两个参数可以省略

s.c_str();		// 返回传统的const char * 类型字符串
s.data();		// 返回一个char * 类型的字符串

/*
当把string对象和字符字面值及字符串字面值混在一条语句中使用时,
必须确保每个加法运算符的两侧的运算对象至少有一个是string
*/

// 遍历 2种方法
// 1.当成字符数组

// 2.
for (char c: s) {
    
}
for (auto c: s) {
    cout << c << endl;
}
for (char &c: s) {
    c = 'a';
}

// string之间的比较支持>,<,>=,<=,==,!=等所有比较操作,按字典序进行比较。
// 当字面值与string相加时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来
string s1 = "hello", s2 = "world";      // 在s1和s2中都没有标点符号
string s3 = s1 + ", " + s2 + '\n';

做题时遇到的知识点

#include <sstream>

// ssin 类似 cin
stringstream ssin(s);

while (ssin >> s) {
    if (s == a) cout << b << " ";
    else cout << s << " ";
}

// sscanf 
sscanf(s, "%d%d%s%lf", &a, &b, &c, str);
// 最后一个字符
s.back()
// 取出最后一个字符,原字符串中的最后一个字符会被去掉
s.pop_back()

参考资料

DAY7 字符串(一):字符串基础+反转字符串
第5讲 字符串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wei *

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

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

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

打赏作者

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

抵扣说明:

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

余额充值