#C03L07P01. C03.L07.字符串入门.概述

C03.L07.字符串入门.概述

字符串可以作为一维字符数组来处理,那么字符串的输入和输出也可以按照数组元素来处理,上节课内容已经讲解。(字符数组和字符串有细微差别,比如:字符数组是一个一个赋值,字符串可以整体赋值也可以一个一个赋值等,后期做题可以慢慢体会)本节介绍将字符串作为一个整体进行输入和输出的语句。

单引号括起来的是字符:例如’a’是字符a,双引号括起来的才是字符串,例如”a”是字符串a

## 字符串输入

从键盘输入一个字符数组可以使用scanf(cin)语句或getline语句。

### (1) cin语句

cin可以适用于字符数组和string变量。

string a;
cin>>a;

char s[100];
cin>>s;

cin>>s1>>s2>>s3; 从键盘分别输入Let us go,则三个字符串分别获取了三个单词。反过来可以想到,如果仅有一个输入字符串名称的情况下,字符串变量仅获取空格前的内容。

cin>>s1; 从键盘分别输入Let us go,则仅有第一个单词被获取,即s1变量仅获取第一个单词 {{ input(1) }} 。

### (2)scanf语句

scanf函数只能针对char数组赋值。

char s2[100];
scanf("%s",s2);  //scanf的第二个参数要填数组名称,其实单独写s2的时候,表示的是s2这个数组的内存地址

char s3[100];
scanf("%s",s3+1);  //s3等同于s3[0]的地址,s3+1 等同于s3[1]的地址。本语句的意思是接收的字符信息放在从s3[1]开始的位置,跳过了s3[0],这对于有时候希望从下标1开始是很有用的

如果希望用scanf接收字符串并赋值给string变量,可以参考下面的例子

char s[100];
scanf("%s",s);

string a;
a=s;  //这句的意思是把字符数组s的内容初始化成一个string类实例返回给string 变量 a

### (3)getline语句

格式:getline(cin,字符串名称);

说明:使用getline只能输入一个字符串。

例如:getline(cin,s1,s2); 是错误的。使用getline,是从光标开始的地方读到换行符也就是说读入的是一整行,而使用scanf是从光标开始的地方到空格,如果这一行没有空格,才读到行尾。

有例如:对于相同的输入 Hello World! ,scanf(“%s”,s1); s1 获取的结果仅仅是 {{ input(2) }} ,而getline(cin,s2); s2 获取的结果则是 {{ input(3) }}

## 字符串输出

向屏幕输出一个字符串可以使用printf语句或cout语句。

(1)printf语句

格式:

  • printf("%s",字符数组名称); //printf不能用于string类的直接输出

  • 下面是错误例子

string a="1234"; 
printf("%s",a);`

说明:

  1. 用 %s 格式输出时,printf 的输出项只能是字符数组名称,而不能是数组元素。例如:printf("%s",a[5]);是错误的。

  2. 输出字符串不包括字符串结束标志符'\0'。 printf函数遇到'\0'的时候就结束输出了,如果字符数组没有'\0',调用printf输出的时候很可能会输出错误的信息。

PS:计算字符串的长度,使用size()函数;

例如:string s;

s.size()为计算字符串s目前存储字符的总个数

(2)cout语句

cout语句适用于对字符数组或者string类变量,参见下面的例子:

string a;

cin>>a;
cout<<a<<endl;

char s[100];
scanf("%s",s);
cout<<s<<endl;

## string 和 char数组的转换

string类和char数组有着密切的关系,但是两者又各自有一套函数。对于信息学考生初级到中级水平的学生而言,有几点建议

  1. 尽量搞熟一套,要么string,要么char数组。两套都搞得很熟太难。

  2. 如果一条题目要围绕着字符串做几个事情,有一部分的事情用string来做比较方便(或者是因为你记得string的某个函数),而做另外的事情用char数组来做方便,那这时候就存在着两者的转换。

把string的内容赋值给char数组:

string a="abcdef"; 
char s[100];

strcpy(s,a.c_str());  //c_str()是string的成员函数,可以把string的内容放入一个字符数组中,并返回字符数组的地址;而strcpy则是把第二个参数(字符数组)的内容拷贝到第一个参数(也是字符数组)

把char数组的内容赋值给string变量:

string a; 
char s[100];

scanf("%s",s);
a = s;  //

对于小朋友而言,每记多一样东西都容易出错,所以,尽量避免string和char之间的转换