一、前言
前面我们学习了运算符的相关知识,今天我们来学习C语言的各个输入输出函数。
二、输出函数
1、字符输出函数putchar
putchar 是 C 语言标准库中的一个字符输出函数,用来向标准输出(通常是显示器)写一个字符。其格式为putchar(c),参数:c为字符常量,变量或者表达式。
下面用代码进行举例:
#include <stdio.h>
int main()
{
int c;
char a;
c=65;a='B';
putchar(c);putchar('\n');putchar(a);
return 0;
}
编译并运行,结果如下:
其中为c赋值65,在ASCII表中对应的字符为A,通过putchar进行转换,'\n'表示回车的意思,‘B’直接通过putchar进行输出。
2、格式输出函数printf上
printf 是 C 语言中最常用的格式化输出函数,用来把数据按照指定的格式打印到标准输出(通常是显示器)。其格式为printf(”格式控制符“,输出表)。
下面用代码进行举例:
#include <stdio.h>
int main()
{
int a = 123;
printf("%d %x %o\n", a, a, a);
char b = 'A';
printf("%c\n", b);
float c = 3.14;
printf("%f %e %g\n", c, c, c);
char arr[] = "hello world";
printf("%s\n", arr);
return 0;
}
编译并运行,结果如下:
比较简单,这里不过多赘述。
3、格式输出函数printf下
printf输出函数还有一些附加格式说明符,如下图所示:
下面用代码进行举例,方便理解:
#include <stdio.h>
int main()
{
//例1
int a = 1234;
float f = 123.456;
char ch = 'a';
printf("%8d,%2d \n", a, a);
printf("%f,%8f,%8.1f,%.2f\n", f, f, f, f);
printf("%3c \n", ch);
return 0;
}
编译并运行,结果如下:
可以看到,当有效位数不足时,会在前面补空格,有效位数足够时,则按实际输出;当使用.n格式符时,小数后位数为n,并进行四舍五入。
#include <stdio.h>
int main()
{
//例2
static char a[]= "hello,world!";
printf("%s\n %15s\n %10.5s\n %2.5s\n %.3s\n",a,a,a,a,a);
return 0;
}
编译并运行,结果如下:
"hello,world!"一共有12个字符,所以经过%15s输出后前面要加3个空格;%10.5s是一共要输出10位,但是后面的.5是实际输出的位数,所以只输出“hello”,前面再加5个空格;%2.5s是一共要输出2位,但是后面的.5是实际输出的位数,所以只输出“hello”,前面不用加空格;%.3s是输出实际位数3位,所以输出“hel”。
#include <stdio.h>
int main()
{
//例3
int a = 1234;
float f = 123.456;
printf("%08d \n",a);
printf("%010.2f \n",f);
printf("%0+8d\n",a);
printf("%0+10.2f",f);
return 0;
}
编译并运行,结果如下:
其他说明符有大家可以自己编辑一下,这里不再赘述。
4、字符串输出函数puts
puts 是 C 语言的字符串输出函数,用于将一个以\0结尾的字符串输出到标准输出,并在结尾自动换行。下面用代码进行举例:
#include <stdio.h>
int main()
{
char arr[6]={"hello"};
puts(arr);//输出完立马换行
puts(arr);
return 0;
}
编译并运行,结果如下:
三、输入函数
1、字符输入函数
getchar() 是 C 语言的标准输入函数,用于从键盘一次读取一个字符,并以 int 类型返回。下面通过代码举例:
#include <stdio.h>
int main()
{
char ch;
ch = getchar();
putchar(ch);
return 0;
}
编译并运行,随便输入一个字符,结果如下:
2、格式输入函数scanf
scanf 是 C 语言的标准输入函数,用于按照指定的格式控制符从键盘读取数据并存入相应的变量中。其格式为:scanf(“格式控制串”,地址表);功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束;地址表为变量的地址,常用取地址运算符&。
注:在Visual Studio 2022版本中,一开始scanf函数是无法使用的,因为scanf函数被认为是不安全的,编译器会报错。可以通过引入下面这个字符串“_CRT_SECURE_NO_WARNINGS”来屏蔽不安全函数错误,具体步骤如下:
1、解决方案下的工程点右键进入属性
2、点击C/C++的预处理器
3、点击预处理器定义,点击编辑
4、将字符串“_CRT_SECURE_NO_WARNINGS”加入到预处理器定义
这样操作下来就可以使用scanf()函数了。
目前,scanf支持的格式字符很多,比如:
下面使用代码进行举例:
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("%d\n",a);
return 0;
}
编译并运行,随机输入一个数,结果如下:
scanf函数支持的说明符可以带以下修饰符:
下面使用代码进行举例:
#include <stdio.h>
int main()
{
//例1
int a,b,c;
scanf("%4d%2d%2d", &a, &b, &c);
printf("%d-%d-%d\n", a, b, c);
return 0;
}
编译并运行,输入20250819,结果如下:
可见20250819被拆分成指定的数据宽度。
#include <stdio.h>
int main()
{
//例2
int a,b,c;
scanf("%2d %*3d%2d",&a,&b);
printf("%d %d\n", a, b);
return 0;
}
编译并运行,输入1234567,结果如下:
可见中间的三位被抑制掉了,没有赋给变量。
用"%c"格式符时,空格和转义字符作为有效字符输入
#include <stdio.h>
int main()
{
//例3
char c1,c2,c3;
scanf("%c%c%c", &c1, &c2, &c3);
printf("%c %c %c\n", c1, c2,c3);
return 0;
}
编译并运行,输入a,空格和b,结果如下:
3、输入函数垃圾清理
使用输入函数可能会留下垃圾,比如下面这个例子:
#include <stdio.h>
int main()
{
int x;
char ch;
scanf("%d",&x);
scanf("%c",&ch);
printf("x =%d ch = %c \n",x,ch);
return 0;
}
编译并运行,输入1和a结果如下:
可以看见只输入了个1,字符还没输入的时候,编译器将回车当成有效字符输入了,那怎么避免这种情况呢?
1、方法1:用getchar清除
#include <stdio.h>
int main()
{
int x;
char ch;
scanf("%d",&x);
getchar();
scanf("%c",&ch);
printf("x =%d ch = %c \n",x,ch);
return 0;
}
编译并运行,结果如下:
可以看到空格被吸收了,字符成功输入进去了。
2、方法2:用“%*c”来 吃掉
#include <stdio.h>
int main()
{
int x;
char ch;
scanf("%d",&x);
scanf("%*c%c",&ch);
printf("x =%d ch = %c \n",x,ch);
return 0;
}
编译并运行,结果如下:
可以看到回车被抑制符*给屏蔽掉了。
4、字符串输入函数gets
gets()是 C 语言的字符串输入函数,用于从标准输入读取一行字符串存入字符数组,并自动加 ‘\0’ 。但在Visual Studio 2022版本中,其头文件里将字符串输入函数定义成了gets_s()。
下面使用代码进行举例:
#include <stdio.h>
int main()
{
char a[6], b[6];
gets_s(a);
gets_s(b);
puts(a);//输出完立马换行
puts(b);
return 0;
}
编译并运行,分别输入hello和world,输入结果如下:
注:与scanf函数不同,gets函数并不以空格作为字符串输入结束的标志