C++中,初学时最常用的输入字符的方式为cin,但是,cin是如何确定已经完成了字符串的输入了呢?由于不能通过键盘输入空字符("\0"),因此cin需要用别的方法来确定字符串的结尾位置。cin使用空白(空格,制表符和换行符)来确定字符串结束的位置,这意味着cin在取字符数组输入时只能读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。如下的程序所示:

#include<iostream>
using namespace std;
int main()
{
const int size = ;
char name[size];
char desert[size];
cout << "请输入你的名字:\n";
cin >> name;
cin.get();
cout << "请输入你最喜欢的甜食:\n";
cin >> desert;
cin.get();
cout << "I have some delicious " << desert << " for you," << " . \n";
cin.get();
return ;
}

程序运行结果:

  请输入你的名字:
  xiao ming
  请输入你最喜欢的甜食:
  I have some delicious ming for you, .

  你看,上图中的运行程序,我还没有对我最喜欢的甜食输入呢,程序就迫不及待的显示了下面的内容。这是因为:cin把xiao作为了第一个字符串,并把它放入了name数组中,把ming这个字符串留在了输入队列中。当cin在输入队列中搜索用户喜欢的甜点时,它发现了ming,因此它读取ming,并把它放入了dessert数组中。

  那么,如何输入一行的字符串呢?

一、面向行的输入:getline()与get()

1. getline()

  getline()函数用于读取整行,它使用通过回车键键入的换行符来确定输入结尾。该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如下面的代码所示就能避免只读取一个单词的错误:

#include<iostream>
using namespace std;
int main()
{
const int size = ;
char name[size];
char dessert[size];
cout << "请输入你的名字:\n";
cin.getline(name, size);
cout << "请输入你最喜欢的甜食:\n";
cin.getline(dessert, size);
cout << "I have some delicious " << dessert << " for you.\n" ;
cin.get();
return ;
}

程序运行结果:

请输入你的名字:
xiao ming
请输入你最喜欢的甜食:
ice cream
I have some delicious ice cream for you.

getline()函数每次读取一行,它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,他用空字符来替换换行符。

2.get()

get的用法和getline()函数一样。但是,get()函数会保存换行符。先看个例子:

cin.get(name,size);

cin.get(name,size);

  就是连续调用了两次get(),由于第一次调用后,换行符将保留在输入队列中,因此,第二次调用时看到的第一个字符便是换行符,因此get()认为以到达结尾,而没有发现任何可读取的内容。

  那么,如何解决这种问题呢?有以下两种方式:

(1)                              

cin.get(name,size);

cin.get(); // 使用不带任何参数的get()可读取下一个字符(即使是换行符),因此,可通过它来处理换行符,为读取下一行输 入做好准备

cin.get(name,size);

(2)cin.get(name,size).get()

程序如下所示:

#include<iostream>
using namespace std;
int main()
{
const int size = ;
char name[size];
char dessert[size];
cout << "请输入你的名字:\n";
cin.get(name, size).get();
cout << "请输入你最喜欢的甜食:\n";
cin.get(dessert, size).get();
cout << "I have some delicious " << dessert << " for you.\n" ;
cin.get();
return ;
}

运行结果:

请输入你的名字:
xiao ming
请输入你最喜欢的甜食:
ice cream
I have some delicious ice cream for you.

字符串的输入问题 C++的更多相关文章

  1. c++字符串的输入的思考

    字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲 ...

  2. Lua 用指定字符或字符串分割输入字符串,返回包含分割结果的数组

    // 用指定字符或字符串分割输入字符串,返回包含分割结果的数组 // @function [parent=#string] split // @param string input 输入字符串 // ...

  3. C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化

      一.字符串输入输出函数 1.  cin.get()   逐个字符输入输出 2.  cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...

  4. Oracle 在字符串中输入单引号或特殊字符

    -- Start 字符串是用单引号括起来的,如果想在字符串中输入单引号该怎么办呢?有两种方法. 方法一:是用两个单引号代表一个单引号 SELECT 'I''m Shangbo' FROM DUAL; ...

  5. <CPP学习 第二天> 字符串的输入 及 String类

    今天简单的学习了字符串的输入以及C++的String类. 1.面向行的输入: getline(); getline()函数读取整行,通过回车键输入的换行符来确定输入结尾.要调用这种方法,可以使用cin ...

  6. [原创]C++带空格字符串的输入问题

    字符串一直是一个重点加难点,很多笔试面试都会涉及,带空格的字符串更是十分常见,现在对字符串的输入问题进行一下总结. C++用cin输入的时候会忽略空格以后的字符,比如 char a[100]; cin ...

  7. C语言基础(9)-字符串格式化输入和输出

    1.字符串在计算机内部的存储方式 字符串是内存中一段连续的char空间,以’\0’结尾 2.printf函数,putchar函数 putchar输出一个char printf是输出一个字符串 prin ...

  8. prmopt 提示框接收字符串,输入后按确定弹出警告框,警告内容为逆序的字符串

    虽然已经找到offer,但因为公司还没安排实习,所以在学校的时间多了很多.好吧,这段时间我用来备考四级啦(好悲催,还没过),然后这一天,闲着无聊,就帮妹妹看了这样子一道题目啦. 题目内容: 编制一个从 ...

  9. C/C++中字符串的输入问题

    standard C I/O 头文件:#include <stdio.h> . getchar() 原型:int getchar(void); 功能:从标准输入获取并返回下一个字符,并释放 ...

随机推荐

  1. Struts2_带参数的结果集

    页面请求: <a href="user/user?type=1">传参数</a> action: public Integer type; public S ...

  2. Cordova各个插件使用介绍系列(八)—$cordovaCamera筛选手机图库图片并显示

    原文档请看http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/ionic%E5%9B%BE%E7%89%87%E4%B8%8A%E4%B ...

  3. 理解python yield

    python源代码中经常会有使用yield,带有yield的函数是generator(生成器),它返回是一个迭代值,下面我们分析yield是什么原理,有什么好处? 首先,我们写一个简单的斐波那契数列前 ...

  4. 01、Scala介绍与安装

    01.Scala介绍与安装 1.1 Scala介绍 Scala是对java语言脚本化,特点是就是使不具备脚本化的java语言能够采用脚本化方式来使用,使其具有脚本语言简单.所见即所得的特点,并且编程效 ...

  5. mysql自增ID

    InnoDB引擎的表,执行清空操作之后,表的auto_increment值不会受到影响:一旦重启MySQL,auto_increment值将变成1. MyISAM引擎的表,执行清空操作之后,表的aut ...

  6. Buffer实例

    互联网的基础是数据的传送,一切都围绕着数据展开,比如发送啊,接收啊,这一切都离不开网络,通过之前,学会了通过http模块来搭建一个服务器,也实现了网络爬虫,nodejs中网络的部分,Net这个模块,对 ...

  7. Android Support v4,v7,v13的区别和应用场景

    android-support-v4 是谷歌推出的兼容包,最低兼容Android1.6的系统,里面有类似ViewPager等控件.ViewPager在Android 1.6以下的版本是不自带的,所以要 ...

  8. 手动创建maven项目+cmd+webapp+tomcat

    1.创建文件夹 2.在刚刚创建的文件夹目录下:创建一个scr文件夹和pom.xml文件 3.在pom.xml配置 <?xml version="1.0" encoding=& ...

  9. Meshlab

    打开ply文件的软件,Meshlab. 下载 http://yunpan.cn/cgapukD2La9Se (提取码:37f1) http://pan.baidu.com/s/1pJLnWqJ

  10. C#接口定义

    C#接口定义 C#不支持多重继承,但是客观世界出现多重继承的情况又比较多.为了避免传统的多重继承给程序带来的复杂性等问题,C# 提出了接口的概念.通过接口可以实现多重继承的功能.  继承该接口的类或结 ...