C-风格字符串与面向行输入的一些要点

来源:互联网 发布:mac如何连续选中 编辑:程序博客网 时间:2024/04/29 23:33

C-风格字符串:(字符串储存在char数组中,并以'\0'结束)


一、初始化


利用'{}'初始化char数组:
手动加上'\0'字符,否则不会是为字符串

char dog[5]={'b','e','a','u','x'};//not a string
char cat[5]={'f','a','t','s','\0'};//a string

用cout<<数组名输出:


利用字符常量初始化char数组:
会自动添加上'\0',并且char数组长度最小为字符串长度加1('\0'),但strlen()只计算可见的字符,而不把空字符计算在内】
char fish[8]="Bubbles";
'S'与"S"区别在于后者隐含着'\0',并且"S"实际上表示字符串所在的内存地址;


二、字符串输入


面向word的读入:cin读入

1、使用空白(空格、制表符和换行符)来定界输入的字符串,所以不能作为面向行的输入;

2、并且会将回车键生成的换行留在输入队列中;(有时候可能要用get()提取留在输入队列中的换行符,才能顺利进行下次读取操作)

3、cin输入会忽略空格和换行符,可以用cin.get()输入则不会忽略空格;

4、检测到EOF后,cin将两位(eofbit和failbit)都设置为1,可以通过cin.eof()或cin.fail()的返回值判断文件(EOF)或键盘(ctrl+z)结束;

例:

#include <iostream>
using namespace std;

void main()
{
    char ch;
    int count=0;
    cout<<"Enter the sentence:";
    do
    {
        cin.get(ch);
        cout<<ch;
        count++;
    }while(cin.fail()==false);//windows下模拟EOF按键:ctrl+z,或者再按下回车键
    cout<<endl<<count<<" characters read!\n";
}

面向行的读入:get函数和getline函数

两个函数都有三个参数get/getline(字符数组或字符指针,字符个数[,终止字符]);

getline()读取换行符,先读取换行符随后丢弃换行符,并在输入流缓冲队列中添加'\0'代替换行符;

get()不读取换行符,也不丢弃换行符,而是将其留在输入队列中,在输入流缓冲队列中添加'\0'

实际上get(name,Size).get()等价于getline(name,Size)

例:

#include <iostream>
using namespace std;

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

    cout<<"Enter your name:\n";
    cin.getline(name,ArSize);
    cout<<"Enter your favorite dessert:\n";
    cin.getline(dessert,ArSize);
    cout<<"I have some delicious "<<dessert<<" for you, "<<name<<".\n";
    system("pause");
}

结果:

将上例中getline()用get()代替

cin.get(name,ArSize);

cin.get(dessert,ArSize);

结果如下:


若要使用get()函数并且避免这种程序bug,可以改写:

cin.get(name,ArSize);

cin.get();//留在输入队列中的'\n'提取出来

cin.get(dessert,ArSize);

改写成:

cin.get(name,ArSize).get();

cin.get(dessert,ArSize).get();


注意:

老版的C++可能没有实现不接受任何参数的get()变体,但实现了接受一个char参数的get()变体

读取空行时:
cin.get()读入空行时会设置'failbit‘,之后的输入则会被无效,需要使用cin.clear()清楚'failbit'才能继续输入;

cin.getline()读入空行时不会设置‘failbit'

当输入字符串长于目标字符串时:

cin.get()读到给定的长度,然后将剩下的字符留在输入流中;
cin.getline()读到给定的长度,然后将剩下的字符留在输入流中,并且设置'failbit'阻断后续输入。

如果word是数组名,假设要知道字符数组word中的字符串是不是mate,下面的测试并不能像我们预期的那样:word=="mate";
原因是数组名是数组的地址,用引号括起来的字符串常量也是其地址,所以判断的是地址是否一致,而不是字符串是否相同,C-风格字符串判断要用strcmp()函数(包含在cstring库中)