最近在学习C和C++,除了在写OS的时候用到外,写算法的时候也会用到,整理记录C和C++读取数据的各类方式。ios
[TOC]c++
文章较长,总结稍微详细了一点。git
在 stdio.h
中包含最经典的输出函数 printf
github
#include <stdio.h> // 执行 printf() 函数须要该库 int main() { printf("hello weiwei"); //显示引号中的内容 return 0; }
格式化输出,在 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类无影响;<br/>对o类,在输出时加前缀o;<br/>对x类,在输出时加前缀0x;<br/>对e、g、f 类当结果有小数时才给出小数点。 |
3) 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。函数
4) 精度
精度格式符以“.”开头,后跟十进制整数。本项的意义是:若是输出数字,则表示小数的位数;若是输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。学习
5) 长度
长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。编码
咱们经过一个实例来掌握用法:
#include<cstdio> int main() { int a=15; float b=123.1234567; double c=12345678.1234567; char d='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); // 输出地址 return 0; }
scanf() 应该是咱们全部人接触C语言的第一个输入函数了,输入一样须要指定输入的格式化类型和保存该变量的地址。
#include <cstdio> int main() { int a, 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); char letter; int age; char url[30]; // 字符串的定义 float price; scanf("%c", &letter); scanf("%d", &age); scanf("%s", url); //能够加&也能够不加& scanf("%f", &price); return 0; }
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 | 读取一个字符串(以空白符为结束) |
int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您能够在循环内使用这个方法,以便从屏幕上读取多个字符。
int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您能够在循环内使用这个方法,以便在屏幕上输出多个字符。
#include <stdio.h> int main( ) { int c; printf( "Enter a value :"); c = getchar( ); printf( "\nYou entered: "); putchar( c ); printf( "\n"); return 0; }
char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。
int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。
#include <stdio.h> int main( ) { char str[100]; printf( "Enter a value :"); gets( str ); printf( "\nYou entered: "); puts( str ); return 0; }
因为 gets 函数具备安全问题,如今已经不推荐使用。
使用cin输入时,程序将输入视为一系列字节。每一个字节都被解释为字符编码。无论数据类型是什么,输入一开始都是字符数据,而后cin对象负责将数据转换成其余类型。
string name; std::cin>>name; std::cout<<name;
当你输入Michael Jackon时,通运行程序你会发现name只存储了Michael,这是为何呢?
原来是 cin使用空白(空格,制表符和换行符)来肯定字符串的结束位置。
在读取字符数组时,cin将只会读取第一个单词,cin将该字符串放到数组中,并自动添加空字符。Michael Jackon 之间的空格被看成结束符了,而Jackon被继续留在输入队列中,直到下一次读取输入。
getline() 函数用于读取整行,经过回车键来肯定输入的结尾。
假如你仍是要读取MIchael Jackon
String name; getline(cin,name); std::cout<<name:
或者你能够用char数组
char name[50]; std::cin.getline(name,50); std::cout<<name;
这是你就会发现读取的是Michael Jackon了。
getline虽然经过读取换行符来读取结尾,可是它并不保存换行符,保存字符串是,他会用空字符来代替换行符。
getline读取完一行时,会从下一行开始读,也就是说咱们能够跳过某一行。
假设咱们读取文本文件时,不读取某一行,咱们能够这样作:
string str; getline(cin,str);
这样便跳过这一行了。
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 是 iostream 类的一个实例。cout 对象"链接"到标准输出设备,一般是显示屏。cout 是与流插入运算符 << 结合使用的。咱们使用 cout 来输出各类类型的数据,而不须要考虑输出数据的类型,使用 endl 来换行。
char str[] = "Hello C++"; cout << "Value of str is : " << str << endl;
本文对C和C++中经常使用的输入输出命令作了简单总结,可是暂时尚未涉及到文件的输入输出,以后抽空总结一下C和C++中文件的输入输出。
欢迎访问个人 博客和github( https://github.com/veeupup)!