23.忽略大小写比较字符串大小
一般我们用 strcmp 可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到 \0
为止。
如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。
但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如 Hello
和 hello
在忽略字母大小写时是相等的。
请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。
输入格式
输入为两行,每行一个字符串,共两个字符串。注意字符串中可能包含空格。
数据保证每个字符串的长度都不超过 80。
输出格式
如果第一个字符串比第二个字符串小,输出一个字符 <
。
如果第一个字符串比第二个字符串大,输出一个字符 >
。
如果两个字符串相等,输出一个字符 =
。
输入样例:
Hello
hello
输出样例:
=
思路:
- c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。
- 标准头文件包含操作c-串的函数库。这些库函数表达了我们希望使用的几乎每种字符串操作。
- 当调用库函数,客户程序提供的是string类型参数,而库函数内部实现用的是c-串,因此需要将string对象,转化为char*对象,而c_str()提供了这样一种方法,它返回const char*类型(可读不可改)的指向字符数组的指针。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string a,b;
getline(cin,a);
getline(cin,b);
for (int i = 0; i < a.size(); i ++)
if (a[i] >= 'A' && a[i] <= 'Z') a[i] += 32;
for (int i = 0; i < b.size(); i ++)
if (b[i] >= 'A' && b[i] <= 'Z') b[i] += 32;
int c;
c = strcmp(a.c_str(),b.c_str());
if(c < 0) cout << "<";
if(c == 0) cout << "=";
if(c > 0) cout << ">";
return 0;
}
24.去掉多余的空格
输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。
输入格式
共一行,包含一个字符串。
输出格式
输出去掉多余空格后的字符串,占一行。
数据范围
输入字符串的长度不超过 200200。
保证输入字符串的开头和结尾没有空格。
输入样例:
Hello world.This is c language.
输出样例:
Hello world.This is c language.
思路
思路一:用cin过滤空格
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
while(cin>>s)
cout<<s<<" ";
return 0;
}
思路二:双指针做法
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin, s);
string r;
for(int i = 0; i < s.size(); i++)
if(s[i] != ' ')r += s[i];
else
{
r += ' ';
//下面三行是常见的双指针做法
int j = i;
while(j < s.size() && s[j] == ' ') j++;
i = j - 1;
}
cout<<r<<endl;
return 0;
}
思路三:移动的方法
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
getline(cin, str);
for(int i = 0,len = str.size(); i<len ;i++)
{
if(str[i] == ' ' &&str[i+1] == ' ')
{
for(int j = i; j<len;j++)
str[j] = str[j+1];
//接下来由于循环结束会i++,因此这里提前减去。
i--;
}
}
cout<<str<<endl;
return 0;
}
25.单词替换
输入一个字符串,以回车结束(字符串长度不超过 100)。
该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。
现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入格式
输入共 33 行。
第 1 行是包含多个单词的字符串 s;
第 2 行是待替换的单词 aa(长度不超过 100);
第 3 行是 a 将被替换的单词 bb(长度不超过 100)。
输出格式
共一行,输出将 s 中所有单词 a 替换成 b 之后的字符串。
输入样例:
You want someone to help you
You
I
输出样例:
I want someone to help you
代码
这里用到了stringstream ssin(s),在头文件#include中, 定义了三个类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。主要用来进行数据类型转换。比sscanf,sprintf更加安全。
stringstream函数
基本用法:
#include<iostream>
#include<sstream>
using namespace std;
int main
{
string s;
getline(cin,s);
stringstream ssin(s);
//将string s初始化为一个字符串流,定义完后将ssin当作cin就可以了
//和cin几乎一样,不同的是在s字符串中读取信息
int a,b;
string str;
double c;
ssin>>a>>str>>b>>c;
cout<<a<<endl<<str<<endl<<b<<endl<<c<<endl;
return 0;
}
- 格式是 stringstream ssin; ssin<<s; s是个字符串,s通常用getline(cin,s)来获得。
- 此时的ssin相当于一个缓冲区,保存了字符串里面的所有字符。
- 然后可以通过 ssin>>a;把字符串赋给a,a可以是各种类型的,会跳过空格,与cin相似
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,a,b;
getline(cin,s);
cin>>a>>b;
stringstream ssin(s);
string str;
//stringstream ssin(s);
//定义一个字符串输入流的对象ssin,并调用ssin的复制构造函数,将s中所包含的字符串放入ssin对象中
while(ssin >> str)
if(str == a)cout<<b<<' ';
else cout<< str << ' ';
return 0;
}