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

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库中)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值