字符串的输入问题 C++

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

#include<iostream>
using namespace std;
int main()
{
    const int size = 20;
    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 0;
}

程序运行结果:

  请输入你的名字:
  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 = 20;
    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 0;
}

程序运行结果:

请输入你的名字:
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 = 20;
    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 0;
}

运行结果:

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

原文地址:https://www.cnblogs.com/carlber/p/9862615.html

时间: 2024-08-30 13:39:46

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

字符串的输入问题

字符串的输入问题: 1.    格式化输入函数:scanf("格式字符串", 地址);.将用户输入的数据与格式化字符串进行匹配, 将匹配到的数据赋值给地址所在的内存,使用 %s 作为字符串的格式,需要注意的是,当输入的字符超过数组长度时就会覆盖掉与该数组所占内存相邻的内存中的其他数据.而且有时系统不会报错.假如定义一个长度为5的char 型字符串数组,当输入12345abc时如下图模拟内存空间: 2.    其他输入字符串函数介绍: (1).    gets(数组名或者&变量名

【C】字符串的输入,求输入字符串中最长的单词

首先,基本目标很简单,就是利用C语言:编写一个函数,输入一行字符,将此行字符中的最长的单词输出. 代码如下: #include<stdio.h> void input(char s[]){ int i=0; for(int c;(c=getchar())!='\n';i++){ s[i]=c; } s[i]='\0';//读取完成,记得对这个字符数组封口 } char* findmax(char s[]){ int max=0,word_length=0,p=0,i=0;//这个p是用来记录最

给一个固定的字符串,输入另一个字符串和它比较,直到猜对为止

本以为很简单,其实简单中也能学到很多细节的问题,下面附上自己的程序,自己学到的细节或者觉得要注意的点在注释中有说明 /* 给一个固定的字符串,输入另一个字符串和它比较(要求只要字母对应上就可以,不用大小写一模一样),直到猜对为止 */ /* 思路:将字符串全变为大写字母构成的字符串,再循环比较 */ #include <stdio.h> #include <string.h> #include <ctype.h> #define MAX 40 void ToUpper(

C语言的字符串转为OC中的字符串,控制台输入用户名和密码,判断输入的用户名是否是@“Frank”, 密码 是否是 @“lanou”, 如果用户名和密码都正确,则输出登录成功, 否则输出登录失败.

char name[20] = "";存储用户名 char code[20] = "";存储密码 printf("请输入用户名与密码"); scanf("%s%s", name, code); NSString *str1 = [NSString stringWithFormat:@"%s", name ]; NSString *str2 =[NSString stringWithFormat:@"

C++字符串的输入问题

#include <IOSTREAM> #include <MALLOC.H> using namespace std; /*字符串的输入:使用字符串输入的专属函数gets().cin.get(): gets()同cin.scanf一样,无法检测数组下标越界的问题,这会导致程序运行时崩溃. cin.get()可以指定录入的个数,从而避免了下标越界带来的问题.*/ void main() { const int n = 100; char str[n] = {0}; puts(&qu

字符串的输入scanf 和gets

#include<stdio.h> #include<string.h> #define N 100 int main(int argc, const char *argv[]) { char str1[N]; char str2[N]; ①scanf("%s",str1); ②gets(str1); printf("%s\n",str1); return 0; } ①这种情况如果是打印Hello World这种中间位置有空格的字符串会出现只

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

字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲区.输入的过程大概是这样的,一次输入结束,键盘会向缓冲区存入数据,而相应的读取函数会从缓冲区读取,我们来用具体的代码来演示一下缓冲区具体怎么工作: 仔细看上述代码,我的代码里定义了四个char类型的字符串,并且有cin输入,但是当我们输入一个具有空格的字符串时,直接输出了而忽略了人为的继续输入,原因

[PTA]7-1 找最小的字符串 针对输入的N个字符串,输出其中最小的字符串(c++)

7-1 找最小的字符串 本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串. 输入格式: 输入第一行给出正整数N:随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符. 输出格式: 在一行中用以下格式输出最小的字符串: Min is: 最小字符串 输入样例: 5 Li Wang Zha Jin Xian 输出样例: Min is: Jin 解答: 1 #include <iostream> 2 #include<string> 3 using

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

字符串一直是一个重点加难点,很多笔试面试都会涉及,带空格的字符串更是十分常见,现在对字符串的输入问题进行一下总结. C++用cin输入的时候会忽略空格以后的字符,比如 char a[100]; cin>>a; C++用cin输入的时候会忽略空格以后的字符,输入"hello world"输出的是"hello": 如果用循环输入 for(int i=0;i<100;i++) { cin>>a[i]; } 这样输入100个数吗?或者定义一个n

&lt;CPP学习 第二天&gt; 字符串的输入 及 String类

今天简单的学习了字符串的输入以及C++的String类. 1.面向行的输入: getline(); getline()函数读取整行,通过回车键输入的换行符来确定输入结尾.要调用这种方法,可以使用cin.getline().此函数有两个参数,第一个参数是用来存储的数组名称,第二个参数是要读取的字符数,getline()读取完一行将丢弃换行符. get(); get()函数有几种变体,其中一种变体的工作方式与getline()类似,接受的参数相同,解释参数的方式也相同,并且都读取到行尾,但是get(