数据类型:
char:char为一个字节,所以char的unsigned的范围是0到255,signed类型的话就是-128到127127(-28->27-1);
输入输出:%c
int:在32位系统中(现在普遍是int32位),signed的范围是(-216到215-1),即是-2147483648~+2147483647,unsigned类型 的int 范围:0~4294967295 即( 0到232-1);
输入输出:%d
short int:short int 只有int的一半, 也就是216, 范围为(0到65536-1)long
输入输出:%d
long:long和long int 都是4字节, 要注意:long int的大小和系统是32位还是64位的有关系,事实上,long整型与int能储存的长度差不多
输入输出:%ld
long long int:long long int有8字节, 表示范围为-263到2的63-1,也就是10的18次方左右
输入输出:%lld
float:float占用的内存为4个字节, 和int占用的空间是一样的, 只是保存的方式不同, float采用的是指数的方式保存数字, 精确度会有问题,储存长度大概与int相差无几。(稍微比int大)
输入输出:%f
double:double占用的8个字节的内存, 所以表示范围会比float更大, double保存数值的方式也是为指数保存, 所以也有精确度的问题,表示的长度大概是10的32次方。
输入输出:%lf
另外,补充以下:
%e 表示按指数形式的浮点数的格式输出
%g 表示自动选择合适的表示法输出
%u 表示输出无符号的unsigned(比如unsigned long long int 的输入输出形式就是%llu);
printf("%%");这样才能输出符号%
cin.get(); 只会读取键盘上的Enter键,其他键都不管用,因此该语句可以让程序等待,但是读入的Enter键不被处理
C语言中有专门的暂停语句system("pause");语句在<stdlib.h>头文件里面,还有exit(0);可以使程序退出。
scanf()函数:
1. scanf 函数是有返回值的,它的返回值可以分成三种情况
1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);
如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
2. 为什么前面 scanf 的格式串里面,%s和%c中间需要空格呢?
那是因为如果没空格的话。。。oldchar输入的就是空格了= =.
3. 顺便说一下,printf的返回值是输出的字符数,例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。
-->>总结:就是诸如while(scanf("%s",A)!='\n').......这种写法是不正确的,因为scanf()函数无法精确的识别读取到的内容,它只能返回读到的内容的个数并返回。只有while(scanf("%s",A)!='\n')....这种写法才能精确的读到。
而且非常非常重要的一点就是:scanf()函数是以空格或者回车作为结束输入符号的,也就是打个比方:
#include<cstdio> #include<iostream> #include<cstdlib>
#define N 25253
using namespace std; int main(void) { char A[10]; while(scanf("%s",A)!=' ') { if(A[0]=='+') cout<<"+"<<endl; else { double a=atof(A); printf("%lf",a); } } }
在上面的代码中,如果输入11 + :11与+号之间有空格;这样的话输出结果就是 11.000000+ 这是因为输入完了11之后,有了一个空格,这时输入的11就保存到字符数组A中,之后再输入的+号就在重新的存入到了数组A中,这时的A[0]其实就是+号。
但是如果输入11+ :11与+号之间没有空格,这样的话输出就是11.000000 这时因为11与+号之间没有空格,11+都被同时的存储到了数组A之中,所以导致没有重置调用数组A,这样的话,在经过atof()函数的转化成double数,+号没有特定的数字意义,结果就只是11.000000。
当然还有一种方法,例如#作为结束输入,你可以这样:
while(1) { scanf("%s",S); if(S[0]=='#') {cout<<"zhongzhi";break;} }
但是如果你把'#'换成’\n‘也达不到用回车作为结束的!
写在最后:
如果想要了解更多c++的输入输出流,重定向问题,可以去看一下ungetc函数,getline(cin,) cin.get(), stream,getchar()等这些函数,博主很懒,如果哪天良心发现了,可能会重新回来更新这篇博文。