1.字符串与字符数组定义
关系:字符串=以’\0’结尾的字符数组
char a[10]={'a','b'};//没赋值的默认'\0'
char b[]={'a','b'};//系统默认加一个b[2]='\0'
char c[5]="asdfg";//× 前5后6
2.字符串与字符数组赋值
char c[6]="asdfg";//√
c[6]="asdfg";//×
str1=str2;//×
for(int i=0;str1[i]!='\0';i++)//√
{
str2[i]=str2[i];
}
3.二维数组
char weekday[7][11]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};//不是字母的地方全是'\0'
cout<<weekday[2];//打印Tuesday
(1)数组名=指向数组第一个元素的指针
(2)&a=管辖范围升级
(3)*a=管辖范围降级
int a[3][4]={0};//&a是指向整个二维数组的指针,a 是指向a[0]的指针,a[0]是指向a[0] [0]的指针,a[0][0]不是指针。(a与&a[0]等价,a[0]与&a[0][0]等价,a[0]与*a等价,a[0][0]与**a等价)
4.字符、字符串、字符数组数输入、输出
(1)字符
①cin
char c;cin<<c;//cin不认为空格和回车是数据,因此不读eg.输入ab c读入abc;ctrl+z终止读取
②cin.get()
char c;
while((c=cin.get())!=EOF)//cin.get()把空格和回车当作是数据,因此读;ctrl+z终止读取
{........}
③cin.get(char)
char c;
while(cin.get(c))//把空格和回车当作是数据,因此读;
{........}
④getchar()
c=getchar();//不跳过任何字符
(2)字符串
①cin
char str[5];
cin>>str;
cout<<str1;//str1必须以'\0'结尾,否则有乱码
int a[2]={1,2};
cout<<a;//打印数组a的首地址
②cin.get()
cin.get(ch,10,'\n');//ch——数组名,10——每次读入9个字符放到ch中,'\n'——遇到'\n'结束
//读取失败返回0,成功返回非0
③cin.getline(ch,10,‘o’)
cin.getline(ch,10,‘o’)遇到o时终止,缓冲区指针在o之后;
cin.get(ch,10,‘o’)遇到o时终止,缓冲区指针在o之前。
cin.getline(ch,10)默认遇到’\n’结束(若在cin.getline之前怕读入空格,可加cin>>get())
5.应用
(1)字符串加密
输入一个字符串,变换为后续字符
思想:输入——>挨个处理a[i]++——>挨个输出
#include <iostream>
using namespace std;
int main(){
char a[200];
while (cin.getline(a, 200))//读取 也可用cin.getline(a,200)
{
//处理
for (int i = 0; a[i] != '\0'; i++)// \0 是字符串结束的标识符,写为\n是不正确的
{
if (a[i] == 'Z')
{
a[i] = 'A';
continue;
}
if (a[i] == 'z')
{
a[i] = 'a';
continue;
}
if (a[i] == ' ')
continue;
a[i]++;
}
cout << a << endl;
}
return 0;
}
(2)字符串连接:将输入的短字符串接到长字符串后面
法1:利用strcat()函数可以连接两个字符串;
利用strcpy()函数可以把字符串2连到字符串1后面
#include<iostream>
#include<string>
using namespace std;
int main()
{
char str1[20], str2[20];
cin.getline(str1, 20);
cin.getline(str2, 20);
strcpy(str2, str1);
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
法2:
#include<iostream>
using namespace std;
int main()
{
//读入字符串
char str1[40], str2[40];
cin.getline(str1, 20); cin.getline(str2, 20);
//计算长度
int len1 = 0, len2 = 0;
for (; str1[len1] != '\0'; len1++);
for (; str2[len2] != '\0'; len2++);
//字符串拼接
if (len1 > len2)
{
for (int i = 0; str2[i] != '\0'; str1[len1++] = str2[i++]);
str1[len1] = '\0';//不加\0就不是一个字符串
}
else
{
for (int i = 0; str1[i] != '\0'; str2[len2++] = str1[i++]);
str2[len2] = '\0';//不加\0就不是一个字符串
}
return 0;
3.统计单词数:统计输入的单词个数
思想:每遇到一个空格(空格、初始flag=0)下一个为非空格(flag=1),计一个单词。
#include<iostream>
#include<string>
using namespace std;
int main()
{//思路:每遇到一个前面有空格的字母,字母计数num加1
char str[80];
int num = 0, flag = 0;
cin.getline(str, 80);
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] == ' ')
flag = 0;
else if (flag==0)//只有else,则统计字母个数
{
flag = 1;
num++;
}
}
cout << "共有" << num << "个单词";
return 0;
}
6.填空
int a[3][4],i,j;
_____;//∵a是指向“包含4个int型元素的一维数组”的指针;p与a同类型∴P也是... ∴填int(*p)[4]
p=a;
cin>>i>>j;
cout<<setw(4)<<*(*(p+i)+j);//判断正误:访问元素a[i][j]
//分析:(p+i)为&a[i](a[i][0]的地址);*(p+i)为a[i];*(p+i)+j为a[i]+j=&a[i][j];*(*(p+i)+j)为a[i][j]为p[i][j];综上√
POJ02:找第一个只出现一次的字符
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
输入
一个字符串,长度小于100000。
输出
输出第一个仅出现一次的字符,若没有则输出no。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int count[27] = { 0 },i;
char s1[100000];
cin.getline(s1, 100000);//应用:读一行字符,遇到换行停止
int len1 = strlen(s1);
for (i = 0; i<len1; i++)
{
count[int(s1[i]) - 97]++;
}
for (i = 0; i<len1; i++)
{
if (count[int(s1[i]) - 97] == 1)
{
cout << s1[i];
break;
}
}
if (i == len1)
cout << "no";
return 0;
}