字符与ASCII码:
ASCII码:
ASCII 全称为 ( American Standard Code for Information Interchange),简单的说,就是用 7 位二进制去编码我们生活中常见的数字,大小写字母,标点符号以及一些特殊的控制字符,如下:
数字:0 , 1 , 2 , 3 ... 9
字母:a , b , c ...z , A , B , C ... Z
标点符号以及运算符:,. + - ...
控制字符:回车,换行等控制字符
下面是部分ascii表截图:
字符:
相关知识:
字符型数据在计算机中存储的是字符的ASCII码(ASCII表参见上图)
字符又分为:
控制字符或者通信专用字符 ( 0 ~ 31以及127)
可显示字符 ( 32 ~ 126 )
每个常用字符都对应着一个-128~127的数字,二者之间可以互相转化:
常见ASCII值:
'A'~'Z'的ASCII值为65-90
'a'~'z'的ASCII值为97~122
'0'~'9'是48~57
字符可以参见运算,运算时会将其当作整数
例如下面代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c = 'a';
cout<<(int)c<<endl;
int a=78;
cout<<(char)a<<endl;
return 0;
}
输出结果:
97
N
c/c++常见的字符判断函数:
头文件:
#include<ctype.h>
详见参考:
isalnum函数
int isalnum(int ch);
检查给定字符是否为当前c语言环境下的字母数字字符,包括:
数字 0123456789
大写字母ABCDEFGHIJKLMNOPQRSTUVWXYZ
小写字母abcdefghijklmnopqrstuvwxyz
issalpha函数:
int isalpha(int ch);
检查给定字符是否为字母(包括大小写)
如果是,返回非零值,否则返回零值。
islower(),isupper(),isdigit()
int islower(int ch);
int isupper(int ch);
例题:
题目链接:
https://www.dotcpp.com/oj/problem1035.html
题目描述
编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。
详见:
字符数组:
部分讲解:
字符串就是字符数组加上结束符’\0’。
可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1!
1.字符数组的输入与输出:
Char str[100];
Cin>>str; //输入字符串时,遇到空格或回车就会停止
Cout<<str<<endl; //输出字符串时,遇到空格或回车不会停止
2.读入一行字符串(包括空格):
char str[100];
Gets(str);
3. 字符串操作常用函数需要引入头文件:
#include <string.h>
strlen(str),求字符串的长度
strcmp(a,b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!
strcpy(a,b),将字符串b复制给从a开始的字符数组。
详细请见:
例题:
题目总结:
个人小结:
- 按整行读到string ,推荐用 方法2 getline(cin, string)
- 按整行读到char[] ,推荐用 方法4 cin.getline(cin, char*)
- 读单个字符串,推荐用 cin>>
啰嗦解释如下:
按行读
方法2 getline(cin, string) 和 方法4 cin.getline(cin, char*) 会读到回车为止,并且会把回车丢弃。
方法3 cin.get(cin, char*) 不丢弃回车
其他: fgets 会多读入一个回车,比较麻烦
读字符串
cin >> char* 会自动忽略起始的空格/回车/tab,结尾如果有回车空格,不会丢弃。 ” aa” => “aa”
scanf("%s", char*) 同上
cin >> string 同上
作者:Accepting
链接:https://www.acwing.com/solution/content/10357/
来源:AcWing
字符串(string):
string是可变长的字符序列,比字符数组更加好用。
使用时需要引入头文件:
#include<string>
定义和初始化:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1;//s1是空字符串
string s2=s1;//s2==s1
string s3="hello-world!";
string s4(10,'a');s4->"aaaaaaaaaa"
return 0;
}
输入和输出:
cin,cout
string s1;
cin>>s1;
cout<<s1<<endl;
注意:
不能用printf直接输出string,需要写成:printf(“%s”, s.c_str());
string s="1234";
printf("%s",s.c_str());
getline()
使用getline()读取一整行
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
getline(cin,s);
cout<<s<<endl;
}
empty(),size()
empty()和size()都可以通过string.x调用
empty()
empty函数根据string对象是否为空返回一个对应的布尔值。empty也是string的一个成员函数。只要之用点操作符知名是哪个对象执行了empty函数就可以了。
// 每次读入一整行,遇到空行直接跳过
while(getline(cin,line))
if(!line.empty())
cout<<line<<endl;
size()
size函数返回string对象的长度(即string对象中字符的个数),可以使用size函数只输出长度超过80个字符的行:
string line;
// 每次读入一整行,输出其中超过80个字符的行
while(getline(cin,line))
if(line.size()>80)
cout<<line<<endl;
string的比较
string支持以下所有比较操作(按字典序进行比较):
>
<
>=
<=
==
!=
如果两个string对象的长度不同,而且较短string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象。
如果两个string对象在某些对应位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果。
例子:
string str = “Hello”;
string phrase = “Hello World”;
string slang = “Hiya”;
//str小于phrase, slang大于str也大于phrase
为string对象赋值:
string st1(10, ‘c’), st2; // st1的内容是cccccccccc;st2是一个空字符串
st1 = st2; //赋值:用st2的副本替换st1的内容
//此时st1和st2都是空字符串
两个string对象相加:
string s1 = “hello, ”, s2 = “world\n”;
string s3 = s1 + s2; // s3的内容是 hello, world\n
s1 += s2; // s1 = s1 + s2
字面值和string对象相加
标准库允许吧字符字面值和字符串字面值转换成string对象,所以在需要string对象的地方就可以使用这两种字面值来代替。
strings1=“hello”,s2=“world”;//在s1和s2中都没有标点符号
strings3=s1+“,”+s2+‘\n’;
当把string对象和字符字面值即字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧运算对象至少有一个是string:
strings4=s1+“,”;//正确: 把一个string对象和一个字面值相加
strings5=“hello”+“,”;//错误:两个运算符都不是string
strings6=s1+“,”+“world”;//正确
strings7=“hello”+“,”+s2;//错误:不能把字面值直接相加
注意:C++中的字符串字面值并不是标准库类型string的对象。切记,字符串字面值与string是不同的类型。
处理string对象中的字符:
当字符数组处理
for
例子:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s="nihao";
for(char c: s) cout<<c<<endl;
for(char &c:s) c='a';
cout<<s<<endl;
return 0;
}
结果:
n
i
h
a
o
aaaaa
总结:
有错误的话,请大家指出来