2.1字符串处理

2.1字符串处理

c风格字符串

scanf和sprintf

  1. 定义:
    sscanf(s,"%d",&n);//把字符串s转换为数字n
    printf(s,"%d",n);//把数字转化为字符串
  2. 如何理解:
  • sscanf相当于为把输入的数字当作字符串进行处理做准备
  • sprintf相当于准备把数字当成字符串进行输出
  • 用法与scanf,printf相似

char类型字符串的输入输出规则

  1. getchar,cin, scanf可读入一个字符
  2. cin,scanf遇到空格和换行符停止
  3. gets遇空格不停,一直读到本行结束
  4. 可通过循环getchar()的方式在合适时终止读入,是读入优化的基本写法

scanf和cin的无限输入

while(scanf()!=EOF)或while(cin>>...)
手动输入ctrl+Z终止

string类型字符串

#include<string> !!与<cstring>不同!!

定义

string str;
用法与普通变量相似

输入输出

cin>>,cout<<
遇到空格换行停止

  • 整行输入使用getline(cin,str);

常用操作

  1. 普通类

  1. 函数

  1. 类型转换

  1. 一些有趣的赋值操作:
string str1("ni ");
string str2("hao\n");
str1+=str2;//str1为“ni hao\n”
  • 注意:~~str1="ni "+“hao\n”;~~非法,但str1="ni "+str2;合法

例题:

2.1-b位移包含

要点:

  1. 字符串的位移
l=str1.length()-1;//注意打括号
char z=str1[0];
str1=str1.substr(1,l);//相当于str1.erase(0,1);
str1+=z;//别忘了
  1. 查找子串:

str1.find(str2,0);//寻找从下标0开始str2第一次出现的位置

  • 如未找到返回string::npos
  1. 代码
#include <bits/stdc++.h>
using namespace std;

string str1, str2;

int main() {
    cin >> str1 >> str2;
    if (str1.length() < str2.length())
        swap(str1, str2);
    int l = str1.length() - 1;
    for (int i = 0; i <= l; i++) {
        char z = str1[0];
        str1 = str1.substr(1, l);
        str1 += z;
        if (str1.find(str2, 0) != string::npos) {
            cout << "true" << endl;
            return 0;
        }
    }
    cout << "false" << endl;
    return 0;
}

2.1-c单词替换

要点:

  • 防止查找到的是单词而不是子串,先在单词前后加上空格再进行查找
  • 在string类型字符串前后加空格是要加字符的空格:“ ”
  • 每次以一个单词为单位输入,并在前后加空格
    代码
#include<bits/stdc++.h>
using namespace std;

string s,a,b,str[105];//str用于储存每个单词,便于输入 
char space;
int n;

int main(){
	do{
		n++;
		cin>>str[n];//输入一个单词(字符组) 
		s=s+str[n];
		s=s+" ";
		scanf("%c",&space);
	}while(space==' ');
	s=" "+s;
	cin>>a;a=" "+a+" ";
	cin>>b;b=" "+b+" ";
	int len = a.length(),k=s.find(a,0),l=k;
	while(k!=string::npos){
		s.erase(k,len);
		s.insert(k,b);
		k=s.find(a,l+1);
		l=k;
	}
	cout<<s.substr(1,s.length()-1)<<endl;
	return 0;
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值