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

字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措。

与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲区。输入的过程大概是这样的,一次输入结束,键盘会向缓冲区存入数据,而相应的读取函数会从缓冲区读取,我们来用具体的代码来演示一下缓冲区具体怎么工作;

仔细看上述代码,我的代码里定义了四个char类型的字符串,并且有cin输入,但是当我们输入一个具有空格的字符串时,直接输出了而忽略了人为的继续输入,原因是什么呢?

现在仔细考虑输入流的概念,当我们输入第一串字符串时,我个人理解的是,cin此时没有起作用,我们只是简单的把字符(包括空格,TAB,换行)存到输入流里,当我们按下ENTER(换行)停止键盘向输入流输送数据,然后cin输入函数开始从输入流取数据。

对于cin来说,它会直接从缓冲区读取,当遇到空格,TAB,换行符时,结束输入,正如上述代码所示,我们的cin>>a从输入流提取数据,hereisa提取完后,遇到一个空格,提取结束,然后是cin>>b,cin>>c,cin>>d同样的操作。于是我们看到上述的输出。

cin.get()和cin.getline()两个函数及其相似,大多数情况我们可以将其二者混用,它们的输入可以输入空格,TAB,但遇到空格时结束输入,他们的区别是 getline剔除换行符,而cin.get()则保留换行符。我们看一段代码的测试及结果:

通过上述两段代码,我们看到,对于cin.get()来说,他是保留空格符的,也就是说,他会把空格符保留下来,并且它本身遇到空格符就停止了,然后保留下来的空格符就被下一个读取函数读取了,等价于下个函数提取数据时直接遇到换行符,就直接结束了;而cin.getline()则不同,它别具一格,它英俊潇洒,它遇到换行符时它直接结束,可以把它看成狼人杀的猎人,它死了,它还要带走一个,然后它带走了空格符,它把空格符剔除了,下面的输入丝毫不受影响。

这些c++方面的输入输出,应该说是最基本的知识,但是基本功不扎实,怎么能写出高鲁棒的代码呢?

时间: 2024-08-27 06:37:32

c++字符串的输入的思考的相关文章

一个截取字符串函数引发的思考

背景 前些天,遇到这样一个问题,问题的内容如下: 要求编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如"我ABC", 4,截取后的效果应该为"我AB",输入"我ABC汉DEF", 6,应该输出为"我ABC",而不是"我ABC+汉的半个". 问题 刚看到这个问题的时候,以为还是很简单的,但写出来之后,发现并不是想要的效果.回想一下当时的思路,就发现刚开

字符串的输入问题

字符串的输入问题: 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这种中间位置有空格的字符串会出现只

[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