字符串刷题总结

使用map来映射一个集合以及两种遍历方法

题目:1090 危险品装箱 (25 分)
法一:

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main(){
    map<int,vector<int> > mp;
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        mp[a].push_back(b);
        mp[b].push_back(a);
    }
    for(auto it=mp.begin();it!=mp.end();it++){
        cout<<it->first<<"|";
        for(int j=0;j<(it->second).size();j++){
            cout<<(it->second)[j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

Input

6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006

Output

20001|20002 20003 
20002|20001 
20003|20004 20001 
20004|20003 20005 20006 
20005|20006 20004 
20006|20005 20004 

法二:

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main(){
    map<int,vector<int> > mp;
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        mp[a].push_back(b);
        mp[b].push_back(a);
    }
    for(auto it=mp.begin();it!=mp.end();it++){
        cout<<it->first<<"|";
        for(int j=0;j<mp[it->first].size();j++){
            cout<<mp[it->first][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

Input

6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006

Output

20001|20002 20003 
20002|20001 
20003|20004 20001 
20004|20003 20005 20006 
20005|20006 20004 
20006|20005 20004 

排名的方法

题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400

int k=1;
    for(int i=0;i<v.size();i++){
		cout<<k<<" "<<v[i].name<<" "<<v[i].avscore<<" "<<v[i].num<<endl;
		if(i+1<v.size()&&v[i].avscore!=v[i+1].avscore) k=i+1+1;
	}

vector和stack

如果使用vector的rbegin()和rend()函数会产生和stack一样的作用

辗转相除法模板(求最大公约数时使用)

int gcd(int a,int b){
	return b ? gcd(b,a%b) : a;
}

关于reverse函数的感悟

reverse()反转的是从第一个参数到第二个参数前面的那个数。
例如:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
	vector<int> v;
	for (int i = 0; i < 10; i++) v.push_back(i);
	reverse(v.begin(), v.begin() + 5);
	for (int i = 0; i < 10; i++) cout << v[i] << " ";
	return 0;
}

运行结果:
在这里插入图片描述
说明

v里面储存的是0 1 2 3 4 5 6 7 8 9 ,reverse(v.begin(), v.begin() + 5);是反转0到4(也是5个数)但是反转的是到v.begin()+5前面的那个数。其实reverse(v.begin(),v.end())也是这个道理
在这里插入图片描述
【上图v.begin()忘了加括号了,手动添加】
在这里插入图片描述

用sort给string排序的方法

从大到小排序

#include<iostream>
#include <algorithm>
#include<string>
using namespace std;
bool cmp(char a, char b) {
    return a - '0' > b - '0';//从大到小排序
}
int main() {
    string t="3536425";
    sort(t.begin(), t.end(), cmp);
    cout<<t;   
    return 0;
}

在这里插入图片描述
从小到大排序

#include<iostream>
#include <algorithm>
#include<string>
using namespace std;
int main() {
    string t="3536425";
    sort(t.begin(), t.end());
    cout<<t;   
    return 0;
}

在这里插入图片描述

关于连接两个东西的一些想法

以后将两个东西连接还是使用字符串为好,否则用char可能输出ascll码。
详细:https://blog.csdn.net/weixin_46585199/article/details/119731955

string字符串类型用scanf读入,printf输出

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
    string a;
    a.resize(100); //需要预先分配空间
    scanf("%s", &a[0]);
    printf("%s\n", a.c_str());
    return 0;
}

输出vector元素的方法

输出第一个元素以及最后一个元素

	cout<<(*v.begin()).name<<" "<<(*v.begin()).id<<endl;
    cout<<(*v.rbegin()).name<<" "<<(*v.rbegin()).id<<endl;

关于强制类型转化的一些问题

在这里插入图片描述
在这里插入图片描述

double型强制转化为整型(取四舍五入)的好方法

double myDouble=1.2;
int myInt=int)(myDouble+0.5;
console.log(myInt);

输出vector里面结构体的元素的方式

(*it).name

运用四舍五入来解题

1.对于总成绩要a的40%+b的60%(四舍五入精确到整数)

ans=(a*0.4+b*0.6+ 0.5);

2.对于某个数N四舍五入

t = N / 2 + N % 2;

关于sort里面cmp函数的写法

sort的cmp函数的写法:从大到小排序用>,从小到大排序用<

最后一个不加空格的方式

妙蛙,妙蛙,柳神yyds

  for(auto it=v.begin();it!=v.end();it++){
        if(it!=v.begin()) printf(" ");
        cout<<*it;
    }

C语言定义数组

具体内容:https://blog.csdn.net/weixin_46585199/article/details/119134700
在这里插入图片描述



大写字符串变小写方法

在这里插入图片描述

具体方法:大写字符+32=小写字符

#include <string.h>
#include <stdio.h>
int main()
{
    int i;
    int len;
    char s[20];
    gets(s);
    len=strlen(s);
    for(i=0;i<=len;i++)
    {
        if(s[i]>='A'&&s[i]<='Z')
            s[i]=s[i]+32;//这里
    }
    puts(s);
    return 0;
}

char能存储几个字符或者几个数字

结论:只能存储一个数字或者一个字符

#include <iostream>
using namespace std;
int main() {
	char c1,c2,c3,c4,c5;
	c1='a';
	c2='1';
	c3='abc';//存储了c 
	c4='123';//存储了4 
	c5=1234;//不会有结果 
	cout<<c1<<endl;
	cout<<c2<<endl;
	cout<<c3<<endl;
	cout<<c4<<endl;
	cout<<c5<<endl;
	return 0; 
} 

在这里插入图片描述

字符串与字符相加

字符串可以与字符串相加,也可以与字符相加

#include<iostream>
using namespace std;
int main() {
	string s,s1,s2;
	char c;
	cin >> s1 >> s2 >> c;
	s=s1+s2+c;
	cout << s << endl;
	return 0;
}

在这里插入图片描述

取出一串数字中每位数的方法

法一:用字符串s中的每位 s[i]

    string s;
    cin>>s;//将接收到的数字存入字符串中,这是处理一大串数字的方法
    int sum=0;
    for(int i=0;i<s.length();i++){
        sum+=(s[i]-'0');// -‘0’是将单个字符转化为数字的方法,s[i]可以单个找出字符串的每一位储存的数.
    }
    string num = to_string(sum);//将得到的数字的和转化为字符串,为的是一会儿可以单个位数的输出,这个方法可比除10妙多了。
    
     string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi",
"ba", "jiu"};
    
    for(int j=0;j<num.length();j++){
        cout<<str[num[j]-'0'];// -‘0’是将单个字符转化为数字的方法,将字符串的每一位数字单独输出但是输出的是字符型,-‘0’之后得到的是整型再将其对应到str中的每个拼音
    }

例题链接:(B1002)
https://blog.csdn.net/weixin_46585199/article/details/114943749

法二:先余再除

 //下面这段代码背过,用于在非字符串中求各位数字
 while (a != 0) {
 b[i++] = a % 10;//将数的每一位数存放在数组中
 a = a / 10;
 }

本来在字符串里是不应该写的,但是太妙了,输出重复的数字的方法,拍案叫绝:

 //万万没想到还能这样单个输出
 for (int k = 0; k < b[2]; k++)//注意这里是小于,没有等于
 cout << "B";
 for (int k = 0; k < b[1]; k++)
 cout << "S";
 for (int k = 0; k < b[0]; k++)
 cout << k + 1;
 return 0;
}

例题链接:(B1006)
https://blog.csdn.net/weixin_46585199/article/details/114943749
 
 

输入的方法

1.string是不会读取空格。

int main() {
    string s;
    cin >> s;
    cout << s;
    return 0;
}

上面的代码如果输入 i love you ,输出则是 i

想要string读入空格的方法

string s;
getline(cin,s);//直接读入一整行,放入s中

 
2. while(cin>>s)持续输入方法


    string s;
    stack<string> v;
    while(cin>>s){//这个忽略空格,可以持续读入字符串,得到一个单词就更新了s一次。
    //结束while(cin>>z)的方法是 Enter+“Ctrl+Z”
    	}
    }

例题:https://blog.csdn.net/weixin_46585199/article/details/114960390
 
 

C++中int,long,long long的区别

https://blog.csdn.net/CV_Jason/article/details/85244813
 

tmd在string数组中无法储存int类型的数字

在这里插入图片描述
这里的s1和s2都是将要被存储在stu中的,必须定义位string类型,不能将其定义为别的类型。
否则在下面输出s2的时候就会输出右面这个玩意儿(右面正常,左面不正常)。在这里插入图片描述
例题:https://blog.csdn.net/weixin_46585199/article/details/118463083

字符串可以比较数字的大小

比如:

birth1 = "1814/09/06", birth2 = "2014/09/06"

直接用 >,< 号比较就可以了

例题:https://blog.csdn.net/weixin_46585199/article/details/118464184

关于四舍五入的方法

(四舍五⼊取整),列数是N,
则行数t = N / 2 + N % 2,表示偶数等于除以2,奇数要除以2加1的意思,这样才能满足四舍五入
例题:https://blog.csdn.net/weixin_46585199/article/details/118489269

补充的一些知识和代码:

1,字符串的length()要加括号
2,(b[i] - '0' + a[j] - '0') % 13 == 10,这种判断一定要带上- '0',要不然会判断错误的。
3,(b[i] - '0' + a[j] - '0') % 13 == 11,这种判断一定要带上- '0',要不然会判断的数是不一样的,比如int类型的8+char类型的9不会等于9的
4.开平方,求次方

sqrt(num); //表示求根号num;
cout << pow(x, y);//表示求x的y次方;

等差数列:
通 项 公 式 : a n = a 1 + ( n − 1 ) d 通项公式 :a_n=a_1+(n-1)d an=a1+(n1)d
前 n 项 和 公 式 为 : { S n = n a 1 + n ( n − 1 ) d 2 S n = n ( a 1 + a n ) 2 前n项和公式为:\left\{\begin{matrix}S_n=\frac{na_1+n(n-1)d}{2}\\S_n=\frac{n(a_1+a_n)}{2} \end{matrix}\right. n{Sn=2na1+n(n1)dSn=2n(a1+an)
 
等比数列:
通 项 公 式 : a n = a 1 ⋅ q n − 1 通项公式 :a_n=a_1·q^{n-1} an=a1qn1
前 n 项 和 公 式 为 : 前n项和公式为: n: q = 1 时 : S n = n × a 1 q=1时:S_n=n×a_1 q=1:Sn=n×a1

q ≠ 1 时 : { S n = a 1 ( 1 − q n ) 1 − q S n = a 1 − a n q 1 − q q\ne1时:\left\{\begin{matrix} S_n=\frac{a_1(1-q^{n})}{1-q} \\ S_n=\frac{a_1-a^{n}q}{1-q} \end{matrix}\right. q=1{Sn=1qa1(1qn)Sn=1qa1anq

 
 
 
 

关于string和cout的事情

1.如果用string接收一串数字那必须加双引号”“,否则会出现乱码:

在这里插入图片描述

2.但是如果用cin,然后用户直接输入一串数字,不用加双引号也没事,如s。

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
    string s;
    cin >> s;

    cout << "------s的数据------" << endl;
    cout << "-----分隔符-----" << endl;
    cout << s[0]<<endl;
    cout <<  "-----分隔符-----"  << endl;
    cout << s[1] << endl;
    cout <<  "-----分隔符-----"  << endl;
    cout << "s的长度为:"<<s.length()<<endl;
    

    string s1, s2;

    s1 = "0123456";
    cout << "------s1的数据------" << endl;
    cout << "-----分隔符-----" << endl;
    cout << s1[0] << endl;
    cout << "-----分隔符-----" << endl;
    cout << s1[1] << endl;
    cout << "-----分隔符-----" << endl;
    cout << "s1的长度为:" << s1.length() << endl;


    cout << "------s2的数据------" << endl;
    s2 = 0123456;
    cout << "-----分隔符-----" << endl;
    cout << s2[0] << endl;
    cout << "-----分隔符-----" << endl;
    cout << s2[1] << endl;
    cout << "-----分隔符-----" << endl;
    cout << "s2的长度为:" << s2.length() << endl;

    return 0;
}

在这里插入图片描述

3.不要单独输入s[i]

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
    string s1;
    //字符串不能单独操作里面的元素 
    s1[0]=0;
    s1[1]=1;
    s1[2]=3;
    s1[3]='a';
	for(int i=0;i<s1.length();i++){
		cout<<s1[i]<<endl;
	}
	cout<<"字符串长度="<<s1.length()<<endl; 
	
	
	
	cout<<"--------分割--------"<<endl;
	//错误
	string s; 
	s[0]=344;
	s[1]=33;
	cout<<s[0]<<endl;
	cout<<s[1]<<endl;
	cout<<"字符串s长度="<<s.length()<<endl; 
    return 0;
}

在这里插入图片描述

一些奇妙函数和技巧

string的函数

string初始化

string(int n, char c); //使用n个字符c初始化,注意是char
或者是
string s(int n, char c);

例题:https://blog.csdn.net/weixin_46585199/article/details/118577049

substr()函数

作⽤是截取某个字符串中的⼦串,⽤法有两种形式:

string s2 = s.substr(4); // 表示从下标4开始⼀直到结束
string s3 = s.substr(5, 3); // 表示从下标5开始,3个字符

c_str()函数

c_str()函数,就可以把string类型得到等效字符数组,
然后就可以用scanf()/printf()函数,进行输入/出。
用c_str()函数:c++中的类string使用c_str()可以返回该字符的地址

C++ string的介绍
string 是C++中的字符串。 字符串对象是一种特殊类型的容器,专门设计来操作的字符序列。不像传统的c-strings,只是在数组中的一个字符序列,我们称之为字符数组,而C++字符串对象属于一个类。

#include <iostream>
using namespace std;
int main() {
    string a;
    a = "Jack666";
    printf("%s", a.c_str());
    return 0;
}

string中find()函数:

详细用法:https://www.cnblogs.com/wkfvawl/p/9429128.html

【find也可以找字符char】

注意:如果找到的判断条件一定要写

if (s.find(t)!=s.npos)

不要写 if (!s.find(t)),谨记
在这里插入图片描述
在这里插入图片描述

字符串转换(stoi;stol… …)函数

必杀技!!!!:
C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
点击跳转


stoi函数的使用以及一些测试
stoi()是将字符串转化为int
1.头文件
#include<string>
2.注意!!!
stoi函数会做范围检查,所需转换的数字如果超出int范围,即超出[-2147483648,2147483648],会出现Runtime Error!!!
所以当题目输入字符串长度大于等于10位时,一定要注意!
一个可行的解决方法是使用stoll函数代替stoi,将string转化为long long int。
 
类似函数:
stol等:将string转化为其他类型
atoi等:不接受string作为输入参数,需将string转化为char*。同时,atoi不进行范围检查,超出类型上/下界时直接输出上/下界。

3.测试代码以及结果

#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	cout << "输入s" << endl;
	cin >> s;
	cout << "输出字符串s" << endl;
	cout << s << endl;;
	cout << "输出整型s" << endl;
	int n = stoi(s);
	cout << n << endl;
	return 0;
}

输入 +001
在这里插入图片描述
输入 -001
在这里插入图片描述
输入 + - 001
在这里插入图片描述

vector的函数

重要:vector的insert函数用法

今天在刷PAT的时候刷到了1075 链表元素分类,去看了y总的题解(链表元素分类)发现了如下操作在这里插入图片描述
vector a 的后面插了两个东西,取查了下API发现了vector的insert函数的用法:
在这里插入图片描述
发现可以在指定位置loc前面插入元素,然后做了一些实验来验证:

My Code:

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> v1, v2, v3;
    v1.push_back(1);
    v1.push_back(1);
    v1.push_back(1);
    v2.push_back(2);
    v2.push_back(2);
    v2.push_back(2);
    v3.push_back(3);
    v3.push_back(3);
    v3.push_back(3);
    for (auto it = v1.begin(); it != v1.end(); it++) {
        cout << (*it) << " ";
    }
    cout << endl;
    v1.insert(v1.end(), v2.begin(), v2.end());
    for (auto it = v1.begin(); it != v1.end(); it++) {
        cout << (*it) << " ";
    }
    cout << endl;
    v1.insert(v1.end(), v3.begin(), v3.end());
    for (auto it = v1.begin(); it != v1.end(); it++) {
        cout << (*it) << " ";
    }
    return 0;
}

Output:
在这里插入图片描述


Code2:

#include<iostream>
#include <vector>
using namespace std;
void printVector(vector<int>& v) {

	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

//插入和删除
void test01()
{
	vector<int> v1;
	//尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	printVector(v1);
	//尾删
	v1.pop_back();
	printVector(v1);
	//插入
	v1.insert(v1.begin(), 100);
	printVector(v1);

	v1.insert(v1.begin(), 2, 1000);
	printVector(v1);

	//删除
	v1.erase(v1.begin());
	printVector(v1);

	//清空
	v1.erase(v1.begin(), v1.end());
	v1.clear();
	printVector(v1);
}

int main() {

	test01();

	system("pause");

	return 0;
}

Output:
在这里插入图片描述


max()和min()函数的详细用法


stack的函数

关于stack的注意点
一开始是这样写的,发现不对,最后找到了原因。是因为每次循环一次都pop一下,导致st.size()会变小,所以不能在for循环中同时使用stack的size()和pop()。

    for(int i=0;i<st.size();i++){
        if(i!=0) cout<<" "<<st.top();
        else cout<<st.top();
        st.pop();
    }
    int num=st.size();
    for(int i=0;i<num;i++){
        if(i!=0) cout<<" "<<st.top();
        else cout<<st.top();
        st.pop();
    }

algorithm中的函数

sort()函数

int main() {
 vector<int> v(10);
 for (int i = 0; i < 10; i++) {
 cin >> v[i];
 }
 //方式一:
 sort(v.begin(), v.end());// 因为这⾥没有传⼊参数cmp,所以按照默认,v从⼩到⼤排列
 
 int arr[10];
 for (int i = 0; i < 10; i++) {
 cin >> arr[i];
 }
 //方式二:
 sort(arr, arr + 10, cmp); // arr从⼤到⼩排列,因为cmp函数排序规则设置了从⼤到⼩
 
 return 0; 
 }

在这里插入图片描述
在这里插入图片描述

reverse函数

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string s= "hello";
    reverse(s.begin(),s.end());//这里
    cout<<s<<endl;
    return 0;
}

map中的函数

erase()函数

在这里插入图片描述
注意:插入字符串时候要加 "",erase()会把key和对应的value都删除。

#include<iostream>
#include<map>
using namespace std;
int main() {
	map<string, string> m;
	m.insert(pair<string, string>("1", "a"));
	m.insert(pair<string, string>("2", "b"));
	m.insert(pair<string, string>("3", "c"));
	for (auto it = m.begin(); it != m.end(); it++) cout << it->first << " " << it->second << endl;
	m.erase("2");
	cout << "------------------" << endl;
	for (auto it = m.begin(); it != m.end(); it++) cout << it->first << " " << it->second << endl;
	return 0;
}

在这里插入图片描述

重要:map中的find()函数;

是寻找key,如果找不到返回的是m.end();

 if(mp.find(temp)==mp.end()){... ...}//没有找到key

cctype中的函数

toupper

toupper的返回值是一个 int (这是早期C语言遗留下来的一个问题)

Return Value The uppercase equivalent to c, if such value exists, or c
(unchanged) otherwise. The value is returned as an int value that can
be implicitly casted to char.
等价于c 的大写,如果存在这样的值,否则c(不变)。该值作为可以隐式转换为char的int值返回。

如果想输出字母可以参考一下代码:
输入:

#include<iostream>
using namespace std;
int main() {
    char c = 'a';
    cout << (char)toupper(c) << endl;//法一
    putchar(toupper(c));//法二
    return 0;
}

输出:

A
A

补充:

tolower

返回值

等价于c的小写字母(如果存在此类值),否则为c(未更改)。 该值作为可以隐式转换为char的int值返回。

islower

返回值

如果c确实是小写字母 ,则该值不为零(即true)。否则为零(即false)。

isupper

返回值

如果c确实是大写字母 ,则该值不为零(即true)。否则为零(即false)。

杂函数和技巧

sting中的find()toupper()函数
【find也可以找字符char1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,
那么会返回一个特别的标记`npos` 其用法:`string::npos。
2.函数toupper()把小写字母转换为大写字母。要包含头文件<locale>
(In C++, a locale-specific template version of this function (toupper) exists in header <locale>.)

c_str()函数
作用:因为printf是无法打印string类的,c_str()目的是转化string,让其可以用printf打印

#include<iostream>
using namespace std;
int main() {
	string s = "eergsg";
	printf("%s\n", s);//错误用法,会随机打印东西
	
	//正确用法
	printf("%s\n", s.c_str());
	cout << s << endl;
	return 0;
}

在这里插入图片描述

sscanf()
sprintf()
getline()//包含头文件string
isalpha()函数功能:判断**字符**ch是否为英文字母。
若为英文字母,返回非0(小写字母为2,大写字母为1)。若不是字母,返回0
isdigit()判断一个**字符**是否为数字,是返回非零,否返回零
isupper()判断一个字符是否为大写字母,是返回非零,否返回零
islower()判断一个字符是否为小写字母,是返回非零,否返回零
abs()//取绝对值, 应该加#include <cmath>,但是加<iostream>也行

巧用abs()
比如题目始终要求大减小,不用判断a大还是b大讨论,直接将abs(a-b)都一样

to_string();//将**(各种)数字**转化为字符串
//将string转换为double
可以用atof()这个函数,但是这个函数的参数是char*类型的,
因此需将string类型强制转换,方法为在函数的参数中写成 const_cast<const char *>(str.c_str())
string str = "1.26";
double d = atof(const_cast<const char *>(str.c_str()));
while(a.size()<4) a="0"+a;//前面补0
s[i]-'0'的实质就是将单个字符转化为单个数字。
当字符类型的变量赋值给整型变量的时候,系统会自动将其转换成ASCII码。
'0'的ASCII码为48'1'49,依次类推。
sort(a.begin(),a.end());//字符串也能用sort
reverse(a.begin(),a.end());字符串也能用reverse
printf("%04d - %04d = 0000\n",temp1,temp2);//输出的数前面加几个0的方法
while(1){   ...break;}//死循环的方法
判断字符串每位数字是否相等的方法:在复制一个字符串,用if(s1==s2)比较一下
判断两个字符串相等的注意点:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
    vector<int> v(4);
    string s1,s2;
    cin>>s1;
    cin>>s2;
    if(s1==s2) {
    	cout<<"same"<<endl;
	}
    else{
    	cout<<"different"<<endl;
	}
   return 0;
   }

在这里插入图片描述
在这里插入图片描述

c++将字符转换成字符串

#include <sstream>


char c;
string str;
stringstream stream;
stream << c;
str = stream.str();

在这里插入图片描述
在这里插入图片描述
tolower()函数是把字符或者字符串都转化为小写字母
touppre()函数是把字符或者字符串都转化为大写字母
注意:这两个函数的声明在头文件<cctype>
但是经过测试,如果不包含头文件<cctype>仅仅有<iostream>也是可以的

//定义两个字符串
    string a;
    string b;
    //用string库,调用getline, 直接读入一整行
    getline(cin,a);
    getline(cin,b);
    //转换大小写,可以都转换为大写,或者小写
    for (int i=0;i<a.length();++i){
        a[i]=tolower(a[i]);
    }
    for (int i=0;i<b.length();++i){
        b[i]=tolower(b[i]);
    }

string中单独元素的类型

string s;
s[0]char类型的

 

printf()的输出问题

各种打印东西
 

C语言中printf打印形式(%02X, %2X, %-2X, %.nf, %m.nf, %e, %m.ne, %2d, %-2d, %02d, %.2d)

点击即可:www.csdn.com



%s:例如:printf("%s", “CHINA”)输出"CHINA"字符串(不包括双引号)。
%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。可以理解为m前为正,则字符串右对齐。
%-ms:如果串长小于m,则在m列范围内,m前为负,字符串左对齐,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。

#include <stdio.h>
int main(){
   
    char *a;
    a="mynameisma";
    printf("%3.10s\n",a);    //这里m虽然取值为3,但是n的值大于m,所以取值n,保证n个字符输出
    printf("%12.3s\n",a);    //输出"         myn"注意,n取的是元素个数,不包括空格
	return 0;
}

%f:例如:printf("%f", 12.5)输出“12.500000”浮点型数据(不包括双引号)。(%f小数点后默认保留6位小数)
%mf:输出的数据占m列,如字符串本身长度大于m,则突破获m的限制,将浮点型对象全部输出。若串长小于m,则左补空格。可以理解为m前为正,则浮点型对象右对齐。
%-mf:如果浮点型对象长小于m,则在m列范围内,m前为负,浮点型对象左对齐,右补空格。
%m.nf:输出占m列,浮点型对象保留n个小数位。
%-m.nf:其中m、n含义同上,m为输出的宽度,n为保留的小数位数,若浮点型对象长小于m,则在m列范围内,m前为负,浮点型对象左对齐,右补空格

例如:

#include <stdio.h>
int main(){
   
 
    float a=12.3;
    printf("%10.3f",a);
    
	return 0;
}
 
输出结果为:"    12.300",注意没有双引号输出。
#include <stdio.h>
int main(){
   
 
    float a=12.3;
    printf("%-10.3f",a);
    
	return 0;
}
输出结果为:"12.300    ",注意没有双引号输出。

%d就是普通的输出了

%2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格

%02d,和%2d差不多,只不过左边补0


%m.nd :m代表输出一共占m列,不够m列前面补空格,够m列不作任何处理,n代表这个数一共要有n列,不够前面补0,够n列不做任何处理

int main()
{
	int a = 123;
	printf("%.4d\n",a);
	printf("%5d\n", a);
	printf("%5.4d\n", a);
	return 0;
}

在这里插入图片描述
%m.ns :m代表这个字符串一共输出m列,n代表取这个字符串前n个元素输出到整个m列的右侧,当n<m时,用空格补齐左边的余缺,当n>=m时,不做处理

int main()
{
	char*s = "hello world";
	printf("%5.3s\n",s);
	printf("%6.7s\n",s);
	printf("%.2s\n",s);
	return 0;
}

在这里插入图片描述
%m.nf :m代表这个数一共要输出m列,包括小数点和小数的位数,n代表小数的个数,当浮点数的小数小于n时,采用四舍五入,大于时,后面补0

int main()
{
	float a = 1.25;
	printf("%5.1f\n",a);
	printf("%.4f\n",a);
	printf("%4.3f\n",a);
	return 0;
}

在这里插入图片描述


关于double和float以及%f,%lf,%llf的总结
1.建议不要考虑float变量的使用了。
float有效数字6-7位,还不如int类型表示的数据有效性高
double 有效数字15-16位
float占四个字节,double占8字节,在表示浮点数(小数)时double精度要高的很多。

对于float类型的变量,printf()中的说明符可以用%f或%lf,而scanf()中的说明符则只
能用%f;
对于double类型的变量,printf()中的说明符可以用%f或%lf,而scanf()中的说明符则只能用%lf;
对于long double类型的变量,printf()中的说明符可以用%Lf,而scanf()中的说明符则只能用%Lf。

详细博客,点击这里

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值