文章目录
前言
本文主要介绍C语言如何实现把数据进行输入输出并列举一下常见的小错误。
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据类型
众所周知,计算机中的数据是存放在存储单元中的,数据是由010101…组成。与我们现实中学的数学相对应,数可以分为实数,虚数,然后继续分类…。那么计算机子中的数据也可以进行分类,我们依据数据的存储形式以及存储单元的长度对数据进行划分,划分的结果(依据C99标准)可以参考下图。
对于数据类型以下说明:
- 整形变量是以补码的形式存贮到内存当中;
- 不同的数据类型在内存中的占据空间是不同的,对Visual C++而言,char型占据1个字节,int型占据4个字节;
- 上图中标黄色的是字符型(char),这里强调一下:字符型是借助ASCII码存贮到我们的计算机内存当中,而与字符相对应地ASCII码是整数,例如‘a’字符对应的是整数97,空格字符对应的是整数32,也就是字符和整数本质是一样的,所以将字符型划到整型中;
二、基本输出
1.printf函数的基本用法
printf的用法 |
---|
printf(“字符串”) |
printf(输出控制符,输出参数) |
printf(多个输出控制符,多个输出参数) |
printf(输出控制符和非输出控制符,输出参数) |
2.printf函数的格式化输出
A. d 格式符
d格式符用于格式化输出十进制(decmial)字符,使用方法是%nd,n代表字符占据的长度
如果n>0,则使得输出字符向右对齐,字符长度小于n的值,则用空格补齐;如果n<0,则反之;
代码如下(示例):
#include <stdio.h>
int main(void){
int i;
i = 12345;
printf("%10d\n",i);
return 0;
}
//输出结果如下
12345
B. c 格式符
c(char)的控制符和d用法相同,这里我们用‘a’和97用于字符的输出,得到的一样的结果(‘a’的ASCII码是97),这就证实了字符和整数的本质是一样的,以相同的二进制代码存贮到内存当中;
#include <stdio.h>
int main(void){
char ch = 'a';
int i = 97;
printf("%5c\n",ch);
printf("%5c\n",i);
return 0;
}
//输出结果如下
a
a
C. f 格式符
f控制符也具有上面控制符的属性,不同的是%m.nf,其中m的代表是输出的数据的宽度(和上面类似正的是右对齐,负的是左对齐),而n则是要保留的小数的位数;
#include <stdio.h>
int main(void){
float i;
i = 1/3.0;
printf("%5.2f\n",i);
return 0;
}
//输出结果如下
0.33
D. e 格式符
e控制符用于将数字转化为科学计数形式%m.ne,其中m仍是输出结果的长度,n是保留的小数的位数;
#include <stdio.h>
int main(void){
float i;
i = 1000/3.0;
printf("%10.2e\n",i);
return 0;
}
//输出结果如下
3.33e+02
3.putchar函数的基本用法
putchar函数用于输出单个字符,我们可以向它传递字符型变量或整型变量,例如‘a’和97,二者输出结果相同;
#include <stdio.h>
int main(void){
char ch = 'a';
putchar(ch);
putchar(97);
return 0;
}
//输出结果如下
aa
三、基本输入
1.scanf函数的基本用法
scanf函数是C语言中的输入函数,一般形式为sacnf(‘输入控制符’,输入参数),这里的输入参数是以一个变量地址为变量,例如&i;关于scanf函数有以下几点说明:
- scanf函数中采用输入控制符,原因是因为我们通过键盘输入到计算机中的数据类型全部为字符(char型),例如输入:987,我们直观上认为是九百八十七数字,实际上计算器理解的是‘9’,‘8’,‘7’三个字符,所以为了实现我们最初的目的将九百八十七输入到计算机中,所以要将字符格式转化,使用‘%d’化为十进制(decimal);
- 关于scanf函数的输入参数,输入参数是组成是‘取地址运算符+要取地址的变量’即‘&i’,相当于将获取的数据存入以变量 i 地址为地址的变量中,也就是将获得数值赋值给变量i;
- 关于scanf函数的读取问题,scanf函数若采用%d作为输入控制符,则读取所有的数字直到出现字符不是数字为止:scanf函数若采用%c作为输入控制符,则只读取第一个字符char;
A. scanf含有非输入控制符
scanf含有非输入控制符时,必须把非输入控制符进行输入;
代码如下(示例)
#include <stdio.h>
int main(void){
int i,j,k;
scanf("i = %d j = %d k = %d",&i,&j,&k);
printf("%d,%d,%d\n",i,j,k);
return 0;
}
//输出结果如下
i = 1 j = 2 k = 3
1,2,3
B. 多个scanf同时使用
示例一:
#include <stdio.h>
int main(void){
int i,j;
char c1,c2;
scanf("%d %d",&i,&j);
scanf("%c %c",&c1,&c2);
printf("i = %d,j = %d,c1 = %c,c2 = %c\n",i,j,c1,c2);
return 0;
}
//输出结果如下
1 2 a b
i = 1,j = 2,c1 = ,c2 = a
为什么c1和c2不按照我们预想的输出?这是因为我们从键盘中的输入都是字符,空格回车都是字符,所以第二个scanf先获取了空格字符然后再获取了a字符。
示例二:
# include<stdio.h>
int main(void){
int i,j;
scanf("%d",&i);
printf("i = %d\n",i);
scanf("%d",&j);
printf("j = %d\n",j);
return 0;
}
//输出结果如下
123m
i = 123
j = 32766
上面的代码也是用了两个scanf函数,我们想要获得用户的输入,但是如果我们输入的不只是数字还有字符,这样程序的输出结果也会出错。例如上面输入的123m,第一个scanf获得123并通过第一个printf正确输出,但是第二个scanf获得了123后面的字符m,由于第二个字符的格式控制符是‘%d’,所以无法进行正确的格式转化所以输出异常的结果,那么如何修改上面的程序?请参考下面的程序。
# include<stdio.h>
int main(void){
int i,j;
char ch;
scanf("%d",&i);
printf("i = %d\n",i);
//借助while循环实现防出错
while ((ch = getchar()) != '\n')
continue;
scanf("%d",&j);
printf("j = %d\n",j);
return 0;
}
总结
关于字符的格式化输出,可以和我的另一篇文章python内置函数之format()进行类比,举一反三。