输入输出专题
一、输出函数
1.1字符输出函数 putchar()
在ubuntu下打开终端,通过man手册查找putchar,输入命令man 3 putchar
可查看到关于putchar函数的用法及返回值。
格式:putchar(c)
参数:c为字符常量、变量或表达式
功能:把字符c输出到当前终端
返回值:正常为显示的代码值,错误返回EOF(-1)
tips:学习任何一个函数之前,可以先去编程验证一下这个函数。
用一个例子演示,代码及演示结果如下:
/*
* @Description:
* @Author:
* @Date: 2022-06-30 20:02:53
* @LastEditTime: 2022-06-30 20:05:27
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int c = 0; // initial c 一切变量尽量初始化,避免不可预期错误
char a = 0;
c = 65;
a = 'B';
putchar(c);
putchar('\n');
putchar(a);
putchar('\n');
return 0;
}
//演示结果为在终端打印A B
1.2格式输出函数 printf
通过man手册查询printf的描述、参数及返回值。在终端下输入命令:man 3 printf
格式:printf("格式控制串",输出表)
功能:按指定格式向显示器输出数据
输出表:要输出的数据
#常用格式说明符:%d %s %x %u %o %f %e %g
修饰字符:
用几个例子演示格式输出函数,代码及演示结果如下:
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 21:20:40
* @LastEditTime: 2022-06-30 21:21:50
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
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;
}
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 21:20:40
* @LastEditTime: 2022-06-30 21:28:53
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
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;
}
1.3字符串输出函数 puts
格式:int puts
功能:向显示器输出字符串并且在输出结束后换行
说明:字符数组必须以'\0'结尾
返回值:成功返回非0数值 失败返回EOF
用代码演示:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char *s = "welcome";
puts(s);
return 0;
}
二、输入函数
2.1字符输入函数 getchar
通过man手册查询getchar的描述、参数及返回值。在终端下输入命令:man 3 getchar
格式:getchar()
功能:从键盘读一字符
返回值:正常,返回读取的值 失败,返回EOF
用例子演示字符输入函数,代码及演示结果如下:
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 21:33:40
* @LastEditTime: 2022-06-30 21:34:45
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int c = 0; // initial
printf("please enter a character:");
c = getchar();
printf("%c--%d->hex%#x\n",c,c,c);
return 0;
}
注意:getchar返回值的含义是存储从键盘上读取的字符,返回值为int型而非char型,很多人不理解为什么是int型,实际上这里返回的是字符对应的ASCII码值,比如输入0,实际上返回0x30
2.2格式输入函数 scanf
由于getchar是读取单个字符,如果需要读取若干个字符,可以使用scanf函数。
格式:scanf("格式控制串",地址表)
功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束
返回值:成功返回输入的变量个数 失败返回EOF
地址表:变量的地址,常用 &变量 比如&a
常用格式符如下:
常用修饰符如下:
用例子演示格式输入函数,代码及演示结果如下:
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 21:51:27
* @LastEditTime: 2022-06-30 21:56:31
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int yy = 0 , mm = 0 , dd = 0;
int a = 0;
float c = 0.0;
printf("input year month day:");
scanf("%4d%2d%2d", &yy, &mm, &dd);
printf("%d-%d-%d\n", yy, mm, dd);
printf("input int float:");
scanf("%3d%*4d%f",&a,&c);
printf("a=%d , c=%f\n",a,c);
return 0;
}
注意:输入分隔符指定-一般以空格、TAB或回车键作为分隔符。
在输入数据时,遇到以下情况认为该数据结束:
1、空格、TAB或回车
2、宽度结束
3、非法输入
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 22:04:02
* @LastEditTime: 2022-06-30 22:07:43
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch1 = 0 , ch2 = 0 , ch3 = 0;
printf("input three characters:");
scanf("%c%c%c", &ch1, &ch2, &ch3);
printf("output three characters:");
printf("ch1=%c , ch2=%c , ch3=%c\n", ch1, ch2, ch3);
return 0;
}
注意:用“%c”格式符时,空格和转义字符作为有效字符输入
2.3垃圾字符处理
观察以下代码,以下代码存在垃圾字符问题:
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 22:13:52
* @LastEditTime: 2022-06-30 22:16:26
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 0;
char ch = 0;
printf("pelase input a number:");
scanf("%d", &a);
printf("a=%d\n", a);
printf("please input a character:");
scanf("%c", &ch);
printf("ch=%c\n", ch);
return 0;
}
上面运行结果可知,当用户输入的一个数字按下回车后,换行符’\n’还在缓冲区,接下来程序要输入一个字符变量时没有停顿让用户输入,而是直接把缓冲区的’\n’拿走了。这个换行符影响了我们的预期结果,因此称为垃圾字符。
以下是处理垃圾字符的两种方法:
1、调用getchar函数,把垃圾字符吃掉
2、用格式串中空格或者"%*c"来吃掉垃圾字符
常用第一种方法,代码如下:
/*
* @Description:
* @Author: 余红祥
* @Date: 2022-06-30 22:13:52
* @LastEditTime: 2022-06-30 22:21:21
* @LastEditors:
*/
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 0;
char ch = 0;
printf("pelase input a number:");
scanf("%d", &a);
printf("a=%d\n", a);
getchar(); //吃垃圾字符
printf("please input a character:");
scanf("%c", &ch);
printf("ch=%c\n", ch);
return 0;
}
2.4字符串输入函数 gets
格式:char *gets(char *s)
功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加'\0'
说明:输入串长度应小于字符数组维数
返回值:成功返回字符数组的起始地址 失败或输入结束返回NULL
以下代码演示:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char string[15];
printf("please input a string:");
gets(string);
printf("%s\n", string);
return 0;
}
从编译结果发现报警告,因为这个函数需要我们自己把控长度,编译器不会替我们检查长度。如果输入的字符串长度大于字符数组长度,会出现内存越界情况。
三、综合练习
1、用代码实现在终端上输入一行字符,原样输出
答:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char string[100] = {0};
printf("please enter a string:\n");
gets(string);
puts(string);
return 0;
}
2、从键盘输入a , b , c的值,求一元二次方程ax²+bx+c = 0的根,公式如下:
答:
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
float a = 0 , b = 0 , c = 0;
float x1 = 0 , x2 = 0;
float disc = 0 , p = 0 , q = 0;
printf("please input a,b,c\n");
scanf("%f%f%f", &a, &b, &c);
getchar();
disc = b*b - 4*a*c;
if (disc < 0)
{
printf("error input!\n"); //避免出现小于0的异常情况
return -1;
}
printf("disc = %f\n", disc);
p = -b/(2*a);
printf("p = %f\n", p);
q = sqrt(disc)/(2*a);
printf("q = %f\n", q);
x1 = p + q;
x2 = p - q;
printf("\n\nx1 = %5.2f \nx2 = %5.2f \n",x1,x2);
return 0;
}
由于调用了动态库,编译时用了 -lm
ps:欢迎讨论问题,欢迎大佬指点,共同学习进步。