程序基础之数据类型
基本数据类型及其占位符
| 输入占位符 | 输出占位符 | 所占字节数 | 数据范围 | |
|---|---|---|---|---|
unsigned int |
%d |
%d |
4 | 00 ~ 232−1232−1 |
int |
%d |
%d |
4 | −231−231 ~ 231−1231−1 |
long long |
%lld |
%lld |
8 | −263−263 ~ 263−1263−1 |
float |
%f |
%f |
4 | 1.175494351E−381.175494351E−38 ~ 3.402823466E+383.402823466E+38(实际精度6~7位) |
double |
%lf |
%lf |
8 | 2.2250738585072014E−3082.2250738585072014E−308 ~ 1.7976931348623158E+3081.7976931348623158E+308(实际精度15~16位) |
char |
%c |
%c或%d(输出ASCII码) |
1 | 00 ~ 127127 |
bool |
无 | %d(输出 0 或 1) |
1 | 00、11 |
为了精确读入一个小数点后有10位的小数,应该使用下列哪种数据类型?
字符串
字符串的存储有两种方式:字符数组、string
使用字符数组存字符串
char str[100]; 可以存储最长为99个字符的字符串,因为最后的空字符 '\0' 也要存进来。
char str[100]; //定义字符数组存储字符串
scanf("%s", str); //输入字符串,不加取地址符
printf("%s", str);//输出字符串
二维字符数组每行都可以存放一个字符串
cpp
char a[3][5]; //3行二维字符数组,每行最多存放4个字符的字符串
for(int i=0; i<=2; i++){
scanf("%s", a[i]); //a[i]是二维数组中第i行的地址
}
for(int i=0; i<=2; i++){
printf("%s\n", a[i]);
}
字符数组里的字符串,可以进行如下操作:(a、b为字符数组里的字符串)
| 操作 | 函数 | 头文件 |
|---|---|---|
| 求长度 | strlen(字符串); |
#include < cstring > |
| 字符串拷贝 | strcpy(b, a); |
#include < cstring > |
| 字符串比较 | strcmp(a, b); |
#include < cstring > |
补充:
-
strcpy(b, a);将字符串a的内容拷贝到字符数组b中。 -
strcmp(a, b);基于字典序比较字符串a、b的大小。该函数有返回值,若a的字典序更大,则返回大于0的值;若b的字典序更大,则返回小于0的值;若a、b的字典序相同,则返回0。 -
字典序:一个字符串在字典的位置。位置越靠后,字典序越大。一般比较字典序时,会先比较第一对字母,如果字母一样,那么就比较第二对、第三对。当找到字母不相同的字母对时,按照26个字母的字母表顺序比较,哪个字母靠后,他所在的字符串的字典序就越大。如:字符串
"abc"和字符串"abd",是"abd"的字典序更大。如果比到最后两个单词不一样长(比如sigh和sight),那么把短者排在前,sigh的字典序小。
使用string存字符串
string是C++存储字符串的方法,输入输出只能用cin、cout。
cpp
#include <string> // STL中存字符串的头文件
#include <iostream>
using namespace std;
string str;
cin >> str;
cout << str;
string存储的字符串,也可以进行如下操作:(a、b为string的字符串)
| 操作 | 函数 | 头文件 |
|---|---|---|
| 求长度 | str.length(); 或 str.size(); |
#include < string > |
| 字符串拷贝 | b = a; //使用赋值进行拷贝 | |
| 字符串比较 | a < b //使用关系运算符比较, |
此外,string类型的字符串还可以进行复杂的操作:(s,s1,s2,a为string的字符串)
| 操作 | 函数 | 意义 |
|---|---|---|
| 求子串 | s.substr(n); |
会从第n位开始截取到末尾 |
s.substr(n, m); |
会从第n位开始截取m位 | |
| 字符串比较 | s1.compare(s2); |
s1、s2基于字典序进行字符串的比较;如果s1字典序大,会返回1;如果s1字典序小,会返回-1;如果两字符串相同,会返回0。 |
| 删除字符 | a.erase(n); |
从第n位开始全部删除(利用下标) |
a.erase(n, m); |
从第n位开始删除m位(利用下标) | |
a.erase(a.begin()+n); |
删除第n位(利用迭代器) | |
a.erase(a.begin()+n, a.begin()+m); |
从第n位删到第m - 1位(包括第n位,不包括第m位)(利用迭代器) |
举一反三:
cpp
string s = "abcde", k = "defgh";
string s1 = s.substr(2); //则s1等于"cde",从s的第2位开始截到末尾
string s2 = s.substr(1, 3); //则s2等于"bcd",从s的第1位开始截取3位
int a = s1.compare(s2); //因为s1的字典序更大,则a的结果为1
string s3 = s.erase(2); // s3为ab,从下标2开始把全部的字符删除
string s4 = s2.erase(1, 1); //s4为bd,从下标1开始只删除一个位
s1.erase(s1.begin()); // 删除s1的第0位,得到de
k.erase(k.begin()+2, k.begin()+3); // k为"degh"
为华盛达学员同步建设博客。(“我是一条狗,叫了一百年,也没能把中国叫醒”。----马相伯)
浙公网安备 33010602011771号