1.字符类型char和整型int之间的转换
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char c = 'a';
cout << (int)c << endl; // 97
cout << (char)97 << endl; // a
for(int i = 1; i < 128; i++)
{
printf("%d:%c\n",i,char(i)); // 输出整数对应的字符
}
cout << 'b' - 'a' << endl; // 1
cout << 'a' + 3 << endl; // 100
return 0;
}
// 例题1:输入一行字符,统计其中数字字符的个数以及字母字符的个数
int main()
{
char c;
int nums = 0,chars = 0;
while(cin >> c)
{
if(c >= '0' && c <= '9') // 数字字符
{
nums++;
}
else // 字母字符
{
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
{
chars++;
}
}
}
cout << "nums:" << nums << " chars:" << chars << endl;
return 0;
}
2.字符数组
int main()
{
char a1[] = {'C','+','+'}; // 列表初始化,后面没有空字符
char a2[] = {'C','+','+','\0'}; // 列表初始化,含有显示的空字符
char a3[] = "C++"; // 自动添加表示字符串末尾的空字符
cout << sizeof(a1) << endl; // 3
cout << sizeof(a2) << endl; // 4
cout << sizeof(a3) << endl; // 4
cout << a2 << endl; // C++
// 从第一个字符'C'开始输出
cout << a2 + 1 << endl; // ++
// 从第二个字符'+'开始输出
return 0;
}
----------
int main()
{
char s2[100];
cin >> s2 + 1; // abcde
cout << s2 + 2 << endl; // bcde
cout << s2[1] << endl; // a
// 字符数组第一个字符的下标为1
return 0;
}
int main()
{
// cin读入字符串都是读入到空格或者回车为止
char s3[100];
cin >> s3; // abc def
cout << s3 << endl; // abc
// 若想完整读入字符串而忽略空格回车,需要更改读入的方式
char s4[100];
cin.getline(s4,100); // abc def
// 100指这一行最多读入的字符数
cout << s4 << endl; // abc def
// string方式
string s5;
getline(cin,s5); // abc def
cout << s5 << endl; // abc def
return 0;
}
int main()
{
// 借助strlen()计算字符串长度
char s[100];
cin.getline(s,100); // abc def
cout << strlen(s) << endl; // 7
// 计算字符串的长度(不包括\0)
/*手写strlen()
int len = 0;
for(int i = 0; str[i]; i++)
// str[i]:当str[i]不为0或\0时
{
len++;
}
cout << len << endl;
*/
// 借助strcmp(a,b)比较字符串的大小(根据ASCII码)
// a < b:返回-1
// a == b:返回0
// a > b:返回1
char s1[100],s2[100];
scanf("%s%s",s1,s2); // abc abd
cout << strcmp(s1,s2) << endl; // -1
// strcpy():赋值(将后一个复制给前一个)
char s3[100],s4[100];
cin.getline(s3,100); // asd sdf
strcpy(s4,s3); // 将s3复制给s4
cout << s4 << endl; // asd sdf
return 0;
}
int main()
{
// 如何遍历字符串(输出字符串中的每个字符)
char str[100];
cin.getline(str,100);
for(int i = 0; str[i]; i++)
// str[i]:当str[i]不为0或\0时
{
cout << str[i] << endl;
}
return 0;
}
例题2:给定一个只包含小写字符的字符串,请你找到一个只出现1次的字符 如果没有,则输出no
考察知识点:①如何读入字符串
②如何遍历字符串
③如何统计每个字符出现的次数(开一个数组,分别统计26个字母出现的次数)
方法:'a' --> 0 'b' --> 1 'c' --> 2 ......
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
char s[100010];
int cnt[26]; // 存储26个字母的出现次数
cin >> s;
for(int i = 0; s[i]; i++)
{
cnt[s[i] - 'a']++; // 统计每个字符出现的次数
// s[i] - 'a' 可以将'a' --> 0 'b' --> 1 'c' --> 2 ......
}
for(int i = 0; s[i]; i++) // 条件要写到s[i] 因为要找到第一个满足条件的字母,是指的原输入样例中的第一个字母,而不是cnt中的第一个
// 因此,必须要有能力让输入样例遍历完,找到输入样例对应的cnt满足为1的那个数。而输入样例的范围为不超过100000
{
if(cnt[s[i] - 'a'] == 1)
{
cout << s[i] << endl;
return 0; // 如果找到了,就直接结束全部代码
}
}
//只有不存在cnt[s[i] - 'a'] == 1,才会执行到这里 说明不存在满足条件的字符
cout << "no" << endl; // 没有找到,就输出no
return 0;
}
// 标准库类型 string
// 需要引入头文件 #include <cstring>
int main()
{
string s1; // 默认的空字符串
string s2 = s1; // 字符串的复制
string s3 = "haha";
string s4(10,'c'); // cccccccccc 定义了10个c
// string的读入
string s5,s6;
cin >> s5 >> s6;
cout << s5 << ' ' << s6 << endl;
// string忽略空格读入:getline()
string s7;
getline(cin,s7); // dsfav edfa
cout << s7 << endl; // dsfav edfa
return 0;
}
int main()
{
string s1 = "abc",s2;
// 计算字符串的长度 size() 相比strlen(),size()的时间复杂度为O(1),而strlen()的为O(n)
cout << s1.size() << endl;
// 判断字符串是否为空
cout << s2.empty() << endl; // 1
// 字符串的比较
cin >> s2; // csdn
if(s1 != s2) // string字符串的比较不需要借助strcmp,可以直接借助!=比较
{
cout << "-1" << endl; // -1
}
// 字符串的相加
string s3 = s1 + s2;
cout << s3 << endl; // abccsdn
s3 += " is great!";
cout << s3 << endl; // abccsdn is great!
return 0;
}
int main()
{
// 处理string对象中的字符
string s = "Hello World!";
//朴素方式遍历
for(int i = 0; i < s.size(); i++) // string不支持str[i]的写法,必须写成i < s.size()
{
cout << s[i] << endl;
}
// 遍历string的独特方式:范围遍历
for(char c : s) // c是遍历字符串中每一个字符的变量 s是字符串
// c会顺次遍历字符串s中的每一个字符
{
cout << c << endl;
}
// 当我们想要改变c中的值的时候:需要为c加&符号(此时c就等价于str[i])
for(char &c : s)
{
c = 'a';
}
cout << s << endl; // aaaaaaaaaaaa
return 0;
}
// 例题3:输入一个只包含小写字母的字符串,将其中的每个字母替换成它的后继字母,如果原字母是'z',则替换成'a'
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
string s;
getline(cin,s);
for(char &c : s)
{
if(c >= 'a' && c <= 'z')
{
c = (c - 'a' + 1) % 26 + 'a'; // %操作可以将z也覆盖却也不影响其他字母,这种思想要学会!
// c - 'a'可以将字符之间的运算转换为数字之间的运算(结果为整数)
// 最后取余确定是哪个字母后,再+'a'并赋值给char c从而恢复字母
}
else if(c >= 'A' && c <= 'Z')
{
c = (c - 'A' + 1) % 26 + 'A';
}
}
cout << s << endl;
return 0;
}