字符及字符类型
字符及字符变量
字符
可以表示字母、符号等,在编程时使用一对单引号,如’a’,‘b’,‘1’,‘2’,'+'等。
注意:单引号是英文状态的单引号,单引号里只有一个符号,与字符串是英文的双引号,如"abc","123"等。
字符变量
char 标识符1,标识符2,……标识符n;
如:char c; char s=‘w’;
字符变量占用一个字节的存储空间
字符串变量
string 标识符1,标识符2,……标识符n;
如:string c;string s=“ww123”;
ASCII码
注意:‘0’->48 ‘A’->65 ‘a’->97
转义字符表
例题:
例1 将字符串中的小写字母转换成大写字母
给定一个字符串,将其中所有的小写字母转换成大写字母。
输入
输入一行,包含一个字符串(长度不超过100,可能包含空格)。
输出
输出转换后的字符串。
样例输入
helloworld123Ha
####样例输出
HELLOWORLD123HA
//自己写的代码:
#include<iostream>
#include<cstring>
using namespace std;
char s[101];
int main()
{
//memset(s,0,sizeof(s));
cin.get(s,101);
for(size_t i=0;i<strlen(s);i++)
{
if(int(s[i])>=97 && int(s[i])<=97+26)
//说明该字符是小写
s[i]=s[i]-32;
}
cout<<s;
return 0;
}
例2 找第一个只出现一次的字符
题目描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出 no
。
输入格式
一个字符串,长度小于 100000 100000 100000。
输出格式
输出第一个仅出现一次的字符,若没有则输出 no
。
样例 #1
样例输入 #1
abcabd
样例输出 #1
c
样例 #2
样例输入 #2
aabbcc
样例输出 #2
no
//第一次打的,没有AC的代码,然后加了测试语句:
#include<iostream>
#include<cstring>
using namespace std;
int a[26];
char s[100001];
int main()
{
//int cur=0;
memset(a,0,sizeof(a));
int sn;
while(cin>>s)
{
for(int i=0;i < strlen(s);i++)
{
sn = s[i]-97;
a[sn]++;
}
for(int i=0;i<26;i++)
{
cout<<a[i]<<" "; //加入的测试输出语句
if(a[i]==1)
{
cout<<(char)('a'+i);
return 0;
}
}
}
cout<<"no";
return 0;
}
[自己测试结果]
abcbcazbam
3 3 2 0 0 0 0 0 0 0 0 0 1 m
--------------------------------
说明:程序只统计了出现1次的,然后按a~z字母序输出。
改进办法:再走一遍字符串,寻找字母表数组a[]
#include<iostream>
#include<cstring>
using namespace std;
int a[26]; //用来存每个小写字母出现了几次
char s[100001];
int main()
{
int cur=0;
memset(a,0,sizeof(a));
int sn=-1; // 字符相对应a数组的下标值 a对应的下标值为0 —'a'-97=0
cin.get(s,100001);
// 输入了字符串,出现一次的记录一遍
for(size_t i=0;i < strlen(s);i++)
{
sn = s[i]-97;
a[sn]++;
}
//谁是第一个出现的?对照查字母表 a数组
for(size_t i=0;i<strlen(s);i++)
{
cur=((int)s[i])-97;
if(a[cur] == 1)
{
cout<<s[i];
return 0;
}
}
cout<<"no";
return 0;
}
洛谷题解:
#include<iostream>
using namespace std;
bool visit[30];
bool flag[30];
int main()
{
string str;
cin >> str;
for(int i = 0; i < str.size(); i++)
{
if(visit[str[i] - 'a'])
{
flag[str[i] - 'a'] = true;
}
visit[str[i] - 'a'] = true;
}
for(int i = 0; i < str.size(); i++)
{
if(!flag[str[i] - 'a'])
{
cout << str[i];
return 0;
}
}
cout << "no";
return 0;
}
其实问题主要是数组空间太大了,换成string类型,通过了限制
#include<iostream>
#include<cstring>
using namespace std;
int a[26]; //用来存每个小写字母出现了几次
string s;
int main()
{
int cur=0;
memset(a,0,sizeof(a));
int sn=-1; // 字符相对应a数组的下标值 a对应的下标值为0 —'a'-97=0
cin>>s;
// 输入了字符串,出现一次的记录一遍
for(size_t i=0;i < s.length();i++)
{
sn = s[i]-97;
a[sn]++;
}
//谁是第一个出现的?对照查字母表 a数组
for(size_t i=0;i<s.length();i++)
{
cur=((int)s[i])-97;
if(a[cur] == 1)
{
cout<<s[i];
return 0;
}
}
cout<<"no";
return 0;
}