C/C++数据类型,及各种形式的输入输出


数据类型:

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()等这些函数,博主很懒,如果哪天良心发现了,可能会重新回来更新这篇博文。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM