coursera学习——字符串与字符数组

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];综上√
发布了16 篇原创文章 · 获赞 3 · 访问量 302

猜你喜欢

转载自blog.csdn.net/bajiaoyu517/article/details/103907770