复合类型-字符串

一、字符串和 char 类型数组的区别
C++的字符串具有的特性:以空字符(NULL character)结尾,空字符被写作 \0,其 ASCII 码为 0,用来标记字符串的结尾。就是说,以空字符结尾的 char 数组才被视为是字符串。
例如,比较以下两个数组:

char dog[4] = {'a','b',' ','d'};         // not a string 
char cat[4] = {'e','f','g','\0'};        // a string

分析:以上两个都是 char 类型数组,但是只有第二个数组是字符串。

二、字符串常量(字符串字面值)
将字符数组初始化为字符串的方法:只需使用一个用双引号括起的字符串即可,这种字符串被称为字符串常量(字符串字面值)。
例如:

char fish [11] = "Bibble."

注意:用引号括起来的字符串隐式地包含结尾的空字符,因此我们不用在初始化时显示地包括它。并且处理字符串的函数根据空字符的位置,而不是数组长度来进行处理。因此在确定存储字符串所需的最短数组时,一定要将结尾的空字符计算在内。

三、字符串常量的拼接
任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接为一个。(即将两个用引号括起来的字符常量合并为一个)

四、strlen() 运算符和 sizeof() 运算符的区别
■ sizeof 用于计算整个数组的长度
■strlen 用于计算存储在数组中的字符串的长度,而非数组本身的长度,并且他只计算可见字符,不把空字符计算在内。
例如:

char Name[20] = "chinese";
cout << sizeof (Name) <<endl;
cout << strlen(Name) <<endl;

运行结果:

20
7

注意:体会字符串是以空字符结尾的含义,看下面代码
例如:

char Name[10] = "airplane";
cout << Name << endl;
Name[3] = '\0';
cout << Name << endl;

运行结果:

airplane
air

由于将 Name[3]设置为空字符,这就使得该字符串在第3个字符后即结束,虽然数组中还有其他字符。充分体现字符串是以空字符结尾这一规则。

五、字符串的输入
1、cin 输入字符串
cin 使用空白(空格、制表符和换行符)来确定字符串的结束位置。

#include<iostream>
using namespace std;

int main()
{
    const int Arsize=20;
    char name[Arsize];
    char dessert[Arsize];

    cout<<"Enter your name:\n";
    cin>>name;
    cout<<"Enter your favorite dessert:\n";
    cin>>dessert;
    cout<<"I have some delicious "<<dessert;
    cout<<" for you,"<<name<<".\n";
    return 0;
}

运行结果:

Enter your name:
Alistair Dreed
Enter your favorite dessert:
I have some delicious Dreed for you,Alistair.

分析:会发现我们还未看到“Enter your favorite dessert:”这条提示时,程序便已经输出了。问题在于,我们在输入第一条语句“Alistair Dreed”时,由于两个单词之间有 空格,因此 cin 将空格视为“空白”即字符串结束的标志,结束第一段输出(因此我们会发现,只有第一个单词“Alistair”被成功输入到了 name 数组中)。与此同时,第二个单词“Dreed”被留在输入队列中。当运行到第二个 cin 时,cin 会搜索此时输入队列中仍然存在的内容(即单词 “Dreed”),因此 cin 读取该单词,并将其放到 dessert 数组中。(所以你也就没有必要再输入了,便直接输出显示了。)

六、两个面向行的输入的比较
1、面向行的输入: getline( )
①语法格式:

cin.getline ( arrayName , Asize );

getline()函数需要接受两个参数:①用来存储输入行的数组名称;②需要读取的字符数。
但是该函数只能存储 (Asize - 1) 字符,因为它会储存空字符。

特点:该函数通过换行符来确定行尾,但是它不保存换行符,将换行符丢弃,用空字符来替换换行符。

2、面向行的输入:get( )
该函数与getline( )函数功能相同,语法格式相同。它与getline( )函数的区别在于,get( )函数并不在读取并丢弃换行符,而是将换行符保留在输入队列中。
若两次调用get( )函数,无法实现同两次调用getline( )一样的输出两行语句的功能。因为它在第一次调用完时,对此次输入的换行符并未丢弃,而是将其保留在输入队列中。当第二次调用get( )函数时,函数为自动搜索保留在输入队列中的换行符,它认为已经到了句尾,便把换行符输出。
解决这一问题的办法,我们可以使用 get( ) 函数的一种变体:调用不带参数的cin.get( ),处理掉保留在输入队列中的换行符,为读取下一行做准备。
语法格式如下:

cin.get(Name1,Asize1);        // read first line
cin.get();                    // read newline
cin.get(Name2,Asize2);        // read second line

另一种方式如下:

cin.get(Name1,Asize1).get();  // cin.getline(Name,Asize1) 

补充:混合输入字符串和数字
分析下面语句:

 int year;
    cin >> year;
    char address[80];
    cin.getline(address,80);
    cout << year <<"\n";
    cout << address <<"\n";
    return 0;

存在的问题:当我们输入数字年份,cin读取年份后,将回车键生成了换行符并将其保留在输入队列中。后面的 cin.getline( ) 看到换行符后,会自动输出并结束。
解决办法:
① 在 cin 后加入 get( )函数处理掉换行符
语法格式:

cin >> year;
cin.get( );

②还可以利用表达式 cin>>year 返回 cin 对象,将调用拼接起来
语法格式:

( cin >> year ).get();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值