【从零开始学c++】4.char数组和string的千丝万缕

目录

1.char数组:

char的赋值方法:

char数组的赋值方法:

ASCLL码:

char类函数:需包含头文件

 2.stirng:

3.对char数组的输入:

1.cin:

2.cin.etline():

3.cin.get():

cin.getline()与cin.get():

4.对string的输入:

1.cin:跟上文char数组一样,遇到空格会()停止,就不讲了。

 2.getline():注意,这边时直接使用getline(),而不是以cin的类成员来使用。

5.细讲string:

1.内存智能:

2.使用智能:

 string拼接:

原始字符串(raw):

超大分量,放心食用! 


1.char数组

char数组是一种很好的数组实例,可做为低级的string,也可以作为小游戏的像素。


char的赋值方法:

首先,我们要知道char类型的赋值方法:

char a='a';

char的形式为字符,因此赋值时要加上单引号(')。 


char数组的赋值方法:

如果要给char数组赋值,将是这样:

char a[5]={'a','b','c','d','e'};

这样做十分的麻烦,要用上大量的单引号和逗号,其实我们可以把它当作string来使用,直接用双引号来赋值:

char a[5]="abcde";//和上面的代码是一样的

怎么样?是不是快多了?

也可以用之前(【从零开始学c++】3.复合类型(数组)_湿布的博客-CSDN博客)那样让编译器计算元素个数(不加索引),即

char a[]="abcde";//和上面的代码是一样的

ASCLL码:

ASCLL码以斜杠(开头,可做字符,也可做键码(键码这东西以后再说)。

每个字符都对应一个ASCLL码,如:'A'对应的是/65空字符则是/0

因此,我们甚至可以用ASCLL码来代替字符。看!:

int a=65;cout<<(char)a;

首先定义了一个数字变量,当输出时强制转换char型。因此,从ASCLL码表中查找/65,就是'A'。

因此,这同时也说明了char类型只能是字符('a'),不能是字符串("a"):

'S' "S"
符号区别: (')+(') (")+(")
类型区别: 字符常量 字符串
组成: 83 (83)+()

char类函数:需包含<cstring>头文件

1.strcpy():复制   需包含2个对象:1.复制的对象 2.复制的内容 

#include<iostream>
#include<cstring>
using namespace std;
int main()
{char a[20]="anb";char b[20]="bnb";cout<<"复制前:"<<endl;cout<<"a:"<<a<<endl<<"b:"<<b<<endl;strcpy(a,b); cout<<"复制后:"<<endl;cout<<"a:"<<a<<endl<<"b:"<<b<<endl;}


2.strcat():附加   需包含2个对象:1.被附加的对象 2.附加的内容   

#include<iostream>
#include<cstring>
using namespace std;
int main()
{char a[20]="anb";char b[20]="bnb";cout<<"复制前:"<<endl;cout<<"a:"<<a<<endl<<"b:"<<b<<endl;strcat(a,b); cout<<"复制后:"<<endl;cout<<"a:"<<a<<endl<<"b:"<<b<<endl;}

 2.stirng

1.要使用string类,要在程序中包含string类。可以使用std命名空间,也可以使用std::string

你可以把string看成一个智能char数组。举个例子:

char数组 string
内存有限 内存无限

3.对char数组的输入:

1.cin:

                                                                                                                                         

cin>>(变量名);
#include<iostream>
using namespace std;
int main()
{
char a[20];
cin>>a;
cout<<a;
}


 

我们如果用cin>>直接赋值,会发现输入的内容只有前一部分,空格后的部分并未输入!

 

cin有一个特性,就是当赋值时遇到了空格),cin就会停止输入!如果我们将代码改改:

	char a[20],b[20];cin>>a>>b;cout<<a<<endl<<b;

 输入:DW DWAD             a=DW  b=DWAD

此时缓冲区内存在DW DWADcinDW赋值给a,又在缓冲区发现了DWAD,于是又把DWAD赋值给了b。

因此我们不使用cin,因为它存在隐患。


2.cin.etline():

使用cin的类成员getline(),使用方法:

cin.getline(a,20);

cin.getline()包含2个参数,第一:char数组名,第二:数组元素数。

该函数最多只能读取(元素数-1)个元素数(就是20-1,19个),余下的空间要储存空字符()。

因此,该语句将实现把输入内容赋值给数组a

输入:DADA DADA
输出:DADA DADA


3.cin.get():

使用cin的类函数get(),使用方法与cin.etline()类似,解释参数的方式也相同。

但是!cin.get()读取换行符!这意味什么?看!:

#include<iostream>
using namespace std;
int main()
{char a[20];char b[20];cout<<"请输入:";cin.get(a,20);cin.get(b,20);cout<<"a:"<<a<<endl;cout<<"b:"<<b<<endl;
}

 我们会发现,还没输入b时,就已经跳过了。

 解决办法:再调用一次

cin.get(a,20).get();


cin.getline()cin.get():

名称: cin.getline() cin.get()
作用: 对字符数组的输入 对字符数组的输入
共同点: 1.都会换行 2.都是cin的类函数
区别1:优点 使用简单 检查错误简单
区别2失效位 会设置失效位 不会设置失效位

4.对string的输入:

1.cin:跟上文char数组一样,遇到空格会()停止,就不讲了。


 2.getline():注意,这边时直接使用getline(),而不是以cin的类成员来使用。

使用方法:

1.getline(cin,(string名)):该函数会直接将输入的内容赋值给指定的string(a):

getline(cin,a);

2.getline(cin,(string名),'(某个字符)'):该函数与第一种不同,它会在输入的内容中查找指定的字符,然后在把前面的在赋值,与第一种相比,多了一个范围指定的字符)。

#include <iostream>
using namespace std;
int main()
{string a;getline(cin,a,' ');cout<<a;
}

该函数会将输入的内容的空格前部分赋值给a。

 个人感觉和cin挺像的,oh,效果应该是一模一样!

5.细讲string

在前面我们曽讲到string智能char数组。那么相比char数组string智能在哪?

1.内存智能:

名称 char数组 string
内存 索引决定内存 无限

2.使用智能:

虽然string本身就是char数组,但我们可以将string当作简单变量

因此,我们也可以把char数组赋值给string

#include <iostream>
using namespace std;
int main()
{string a;char b[20]="DAW";a=b;cout<<a; 
}

但我们却不能把string赋值char数组


我们也可以像使用char数组那样对string使用索引:

#include <iostream>
using namespace std;
int main()
{string a="oello(你好)";//定义cout<<a<<endl;//先输出a[0]='h';cout<<a;//更改第一个字符为‘h’再输出 
}

 

 但要注意的是:更改的必须是字符!原来是字符,更改后还是字符!

#include <iostream>
using namespace std;
int main()
{string a="oello(你好)";//定义cout<<a<<endl;//先输出a[0]='h';cout<<a;//更改第一个字符为‘h’再输出 
}

a中,a[0]为字符('a'),所以才可以更改。 

 但如果更改的是字符串,就会变成随机的字符串:

#include <iostream>
using namespace std;
int main()
{string a="oello(你好)";cout<<a<<endl; a[7]='h';cout<<a; 
}

因为a[7]字符串("好"),因此a[7]的前一个元素a[6]("你")就会随机:

 同时也潜在一个问题!string包含的的内容不只有char型!像上面的oello(你好)一样,就不是char型!如果试图用string索引的方法输出,那么给你的就是一片空白

#include <iostream>
using namespace std;
int main()
{string a="oello(你好)";cout<<a[6]<<endl; 
}

真·一片空白


 string拼接:

string类可以对string进行拼接:使用+号

#include <iostream>
using namespace std;
int main()
{string a="oello(你好)";cout<<a<<endl;a+=" 我不好";cout<<a; 
}

 该程序会先定义一个string,然后在末尾加上"我不好"。

原始字符串(raw)

输出什么就是什么,就算是转义序列(n)在这你也就是"n"

 以R为开头,用双引号和括号("()")包住,  双引号和括号就是定界符

#include<iostream>
#include<cstring>
using namespace std;
int main()
{cout<<R"(输出n)";
}

 温馨提示:DEV C++无法使用raw原始字符串。   上面的代码是使用VS(Visual Studio)编译的。

都看到这了,就请您点一个免费的小红心和关注吧!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平