文章目录
- 使用map来映射一个集合以及两种遍历方法
- 排名的方法
- vector和stack
- 辗转相除法模板(求最大公约数时使用)
- 关于reverse函数的感悟
- 用sort给string排序的方法
- 关于连接两个东西的一些想法
- string字符串类型用scanf读入,printf输出
- 输出vector元素的方法
- 关于强制类型转化的一些问题
- double型强制转化为整型(取四舍五入)的好方法
- 输出vector里面结构体的元素的方式
- 运用四舍五入来解题
- 关于sort里面cmp函数的写法
- 最后一个不加空格的方式
- C语言定义数组
- 大写字符串变小写方法
- char能存储几个字符或者几个数字
- 字符串与字符相加
- 取出一串数字中每位数的方法
- 输入的方法
- C++中int,long,long long的区别
- tmd在string数组中无法储存int类型的数字
- 字符串可以比较数字的大小
- 关于四舍五入的方法
- 补充的一些知识和代码:
- 关于string和cout的事情
- 一些奇妙函数和技巧
- string中单独元素的类型
- printf()的输出问题
使用map来映射一个集合以及两种遍历方法
#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+(n−1)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(n−1)dSn=2n(a1+an)
等比数列:
通
项
公
式
:
a
n
=
a
1
⋅
q
n
−
1
通项公式 :a_n=a_1·q^{n-1}
通项公式:an=a1⋅qn−1
前
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=1−qa1(1−qn)Sn=1−qa1−anq
关于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:
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也可以找字符char】
1.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)
%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。
详细博客,点击这里