c和c++中读取数据的方式总结

脑机接口
• 阅读 141

目录

最近在学习C和C++,除了在写OS的时候用到外,写算法的时候也会用到,整理记录C和C++读取数据的各种方式。

文章较长,总结稍微详细了一点。

c输出printf()

在 stdio.h 中包含最经典的输出函数 printf

include <stdio.h>      // 执行 printf() 函数需要该库int main(){   printf("hello weiwei");  //显示引号中的内容   return0;}

格式化输出,在 printf中格式化输出的格式:

1)类型

格式字符含义
d以十进制形式输出带符号整数(正数不输出符号)
o以八进制形式输出无符号整数(不输出前缀0)
x,X以十六进制形式输出无符号整数(不输出前缀Ox)
u以十进制形式输出无符号整数
f以小数形式输出单、双精度实数
e,E以指数形式输出单、双精度实数
g,G以%f或%e中较短的输出宽度输出单、双精度实数
c输出单个字符
s输出字符串
p,P%p是一个新的格式控制符,它表示以十六进制的形式(带小写的前缀)输出数据的地址。如果写作%P,那么十六进制的前缀也将变成大写形式。

2)标志

标志含义
-结果左对齐
+输出符号(正负号)
空格输出值为正时冠以空格,为负时冠以负号

对c、s、d、u类无影响;

对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。

3) 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。

4) 精度
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

5) 长度
长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。

我们通过一个实例来掌握用法:

include<cstdio>int main(){   inta=15;   floatb=123.1234567;   doublec=12345678.1234567;   chard='p';   printf("a=%d\n", a);   printf("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a);  // %% 可以输出 %   printf("b=%f\n", b);   printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);   printf("c=%f\n", c);   printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c);   printf("d=%c\n", d);   printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d);   printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);   // 输出地址        return0;}

  • 以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。
  • 以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
  • 输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。
  • 输出字符量d,其中“%8c ”指定输出宽度为8故在输出字符p之前补加7个空格

输入scanf

scanf() 应该是我们所有人接触C语言的第一个输入函数了,输入同样需要指定输入的格式化类型和保存该变量的地址。

include <cstdio>int main(){   inta, b, c;   scanf("%d %d", &a, &b);   printf("a+b=%d\n", a+b);   scanf("%d   %d", &a, &b);   printf("a+b=%d\n", a+b);   scanf("%d, %d, %d", &a, &b, &c);   printf("a+b+c=%d\n", a+b+c);      scanf("%d is bigger than %d", &a, &b);   printf("a-b=%d\n", a-b);      charletter;   intage;   charurl[30];   // 字符串的定义   floatprice;      scanf("%c", &letter);   scanf("%d", &age);   scanf("%s", url);//可以加&也可以不加&   scanf("%f", &price);         return0;}

scanf 函数是一种宽松的输入函数,你需要按照你指定的格式来输入,这个时候就可以按照你输入的格式来读取到响应的数据。

从本质上讲,我们从键盘输入的数据并没有直接交给 scanf(),而是放入了缓冲区中,直到我们按下回车键,scanf() 才到缓冲区中读取数据。如果缓冲区中的数据符合 scanf() 的要求,那么就读取结束;如果不符合要求,那么就继续等待用户输入,或者干脆读取失败。

格式控制符说明
%c读取一个单一的字符
%hd、%d、%ld读取一个十进制整数,并分别赋值给 short、int、long 类型
%ho、%o、%lo读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hx、%x、%lx读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hu、%u、%lu读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
%f、%lf读取一个十进制形式的小数,并分别赋值给 float、double 类型
%e、%le读取一个指数形式的小数,并分别赋值给 float、double 类型
%g、%lg既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
%s读取一个字符串(以空白符为结束)getchar(), putchar()

int getchar(void)函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

int putchar(int c)函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

include <stdio.h>int main( ){   intc;   printf("Enter a value :");   c = getchar( );   printf("\nYou entered: ");   putchar( c );   printf("\n");   return0;}gets(), puts()

char *gets(char *s)函数从stdin读取一行到s所指向的缓冲区,直到一个终止符或 EOF。

int puts(const char *s)函数把字符串 s 和一个尾随的换行符写入到stdout

include <stdio.h>int main( ){   charstr[100];   printf("Enter a value :");   gets( str );   printf("\nYou entered: ");   puts( str );   return0;}

由于 gets 函数具有安全问题,现在已经不推荐使用。

c++输入cin()

使用cin输入时,程序将输入视为一系列字节。每个字节都被解释为字符编码。不管数据类型是什么,输入一开始都是字符数据,然后cin对象负责将数据转换成其他类型。

stringname;std::cin>>name;std::cout<<name;

当你输入Michael Jackon时,通运行程序你会发现name只存储了Michael,这是为什么呢?

原来是 cin使用空白(空格,制表符和换行符)来确定字符串的结束位置。

在读取字符数组时,cin将只会读取第一个单词,cin将该字符串放到数组中,并自动添加空字符。Michael Jackon 之间的空格被当作结束符了,而Jackon被继续留在输入队列中,直到下一次读取输入。

getline()

getline() 函数用于读取整行,通过回车键来确定输入的结尾。

假如你还是要读取MIchael Jackon

String name;getline(cin,name);std::cout<<name:

或者你可以用char数组

charname[50];std::cin.getline(name,50);std::cout<<name;

这是你就会发现读取的是Michael Jackon了。

getline虽然通过读取换行符来读取结尾,但是它并不保存换行符,保存字符串是,他会用空字符来代替换行符。

getline读取完一行时,会从下一行开始读,也就是说我们可以跳过某一行。

假设我们读取文本文件时,不读取某一行,我们可以这样做:

stringstr;getline(cin,str);

这样便跳过这一行了。

get()

iostream 中有一个名为get()的变体,他的工作方式和getline()类似。他们接受参数相同,解释参数的方式也相同,并且都读取到行尾。使用get()读取到行尾时不丢弃换行符,而是将它留在输入队列中:

cin.get(name,50);cin.get(dessert,50);

假设读取了一个字符串,再读取时,读取到的便是换行符了,get()便认为已经到达行尾了,不再继续读取。

怎么解决呢?

我们可以在两次读取之间加一个cin.get();用来读取下一个字符,即使是换行符。

cin.get(name,50);cin.get();cin.get(dessert,50)输出cout

预定义的对象coutiostream类的一个实例。cout 对象"连接"到标准输出设备,通常是显示屏。cout是与流插入运算符 << 结合使用的。我们使用cout来输出各种类型的数据,而不需要考虑输出数据的类型,使用endl来换行。

charstr[] ="Hello C++";cout<<"Value of str is : "<< str <<endl;


本文对C和C++中常用的输入输出命令做了简单总结,但是暂时还没有涉及到文件的输入输出,之后抽空总结一下C和C++中文件的输入输出。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
springboot的起步依赖
!(https://oscimg.oschina.net/oscnet/f3acbe4cf3b00c68207e091c172d6b45a27.png)加载自动配置的方式2:!(https://oscimg.oschina.net/oscnet/40341228c10f7a56d82323a1d622521d92d.png) spring
Wesley13 Wesley13
3年前
Java中的native关键字
一. 什么是NativeMethod  简单地讲,一个NativeMethod就是一个java调用非java代码的接口。一个NativeMethod是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern"C"告知C++编译器去
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
AS Library 使用NDK 的一些坑 Unable to strip library (+深入了解部分gradle机制)
转自: https://www.twblogs.net/a/5c53f1d5bd9eee06ee217e42(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.twblogs.net%2Fa%2F5c53f1d5bd9eee06ee217e42)和https://fuckn
Wesley13 Wesley13
3年前
HTTP面试题(二):HTTP请求报文和响应报文格式
!(https://oscimg.oschina.net/oscnet/0406894fb1274bee91fc53c84c516576.jpg)看都看了还不点个赞!(https://oscimg.oschina.net/oscnet/095d444dc9a449ee85afd19b00fdf52b.png)!(h
Stella981 Stella981
3年前
Duang,HUAWEI DevEco IDE全面升级啦
想感受全新UI带来的视觉及交互体验、HiKey970开发板调测、HiAIAPI推荐和收藏、深度AI模型分析等新功能,体验高清晰度和流畅度的远程AI真机调测吗?!(https://oscimg.oschina.net/oscnet/f4e1bb24ff00b8c6ea27f75370a53bfbacd.jpg)全新的UI设计
Stella981 Stella981
3年前
Hbase性能优化百科全书
!file(https://oscimg.oschina.net/oscnet/upc56c6ed5eae550cace667fa53a9810d4db5.png)本文集合了小编在日常学习和生产实践中遇到的使用Hbase中的各种问题和优化方法,分别从表设计、rowkey设计、内存、读写、配置等各个领域对Hbase常用的调优方式进行了总结,希望能对读
Stella981 Stella981
3年前
C++ Modern C++
    现代的C,比较笼统。最近10多年的东西是否是现代的呢?我认为“时髦”这个词更准确一些。每个年代,时髦总是标新立异的,总是被年龄大一些的人看不惯的(虽然这些人也曾经“赶过时髦”)。ModernC就是用最时髦的东西去装饰您的代码。但是本质的东西还是没有变。改革初期,最时髦的服饰是喇叭裤,霹雳舞手套。那时没有智能手机,时髦的人扛着一台卡带
脑机接口
脑机接口
Lv1
看不清的挽留,正如你执着地向前走
文章
4
粉丝
0
获赞
0