嵌入式Linux C语言程序设计
嵌入式Linux C语言程序设计
数据的输入输出
3.1 数据的输出
在这里我们计论的数据的输出,指的是如何把数据量示到标准输出,即显示器上。
3.1.1 字符输出函数putchar
头文件:stdio.h
函数原型:int putchar(int c)
函数参数:c为字符常量或表达式
函数返回值:输出的字符
函数功能:在标准输出上显示一个字符
示例代码
#include<stdio.h>
int main()
{int a = 65;char b = 'B';putchar(a);putchar('\n');putchar(b);return 0;
}
3.1.2 格式化输出函数printf
putchar函数只能在终端输出一个字符型的数据,如果期望在终端按照 指定的格式输出若干个数据,且为任意类型 ,就可以用printf函数。
头文件:stdio.h
函数原型: int printf(const char *format,…)
函数参数:format指定输出格式,后面跟要输出的变量,为不定参,"…"代表。
函数返回值:成功返回输出的字节数,失败返回-1(EOF)
函数功能:格式化字符串输出
printf支持的格式
格式符 | 作用 | 格式符 | 作用 |
---|---|---|---|
i,d | 十进制整数 | s | 字符串 |
x,X | 十六进制无符号整数 | e,E | 指数形式浮点数 |
o | 八进制无符号 | f | 小数形式浮点数 |
u | 无符号十进制整数 | g | e和f中较短的一种 |
c | 单一字符 | %% | 百分号本身 |
printf支持的格式说明符的修饰符
修饰符 | 功能 |
---|---|
m | 输出数据域宽,数据长度<m,左补空格;否则按实际输出 |
.n | 对实数,指定小数点后面位数(四舍五入) |
.n | 对字符串,指定下实际输出位数 |
- | 输出数据在域内左对齐(缺省右对齐) |
+ | 指定在有符号的正数前显示正号+ |
0 | 输出数值时指定左面不使用的空位自动填0 |
# | 在八进制和十六进制数前显示前导0,0x |
l | 在d,o,x,u前指定输出精度为long型 |
l | 在e,f,g前指定输出精度为double型 |
常用转义字符
转义符 | 功能 |
---|---|
\b | 退格(BS),将当前位置移到前一列 |
\n | 换行(LF),将当前位置移到一行开头 |
\t | 水平指平(HT)(跳到下一个TAB位置) |
\r | 回车(CR),将当前位置移到本行开头 |
" | 代表一个双引号字符 |
\ | 代表一个反斜字符’’ |
代码示例
#include <stdio.h>
int main()
{int a = 1234;float f = 123.478;char ch = 'a';char s[] = "Hello world";printf("%8d,%2d",a,a);printf("%f,%8f,%8.1f,%2f",f,f,f,f);printf("%3c\n",ch);printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n",s,s,s,s,s);return 0;
}
下面举个例子,演示一下格式符"-"的用法。
#include <stdio.h>
int main()
{int a = 1234;float f = 123.456;char s[] = "Hello world";printf("%8d,%-8d\n",a,a);printf("%10.2f,%-10.1f\n",f,f);printf("%10.5s,%-10.3s\n",s,s);return 0;
}
下面例子,演示一下格式符“0”,“+”,“#”的用法
#include <stdio.h>
int main()
{int a = 1234;float t = 123.456;printf("%08d\n",a);printf("%010.2f\n",f);printf("%0+8d\n",a);printf("%0+10.2f\n",f);a = 123;printf("%0,%#0,%X,%#X\n",a,a,a,a);return 0;
}
3.2 数据据输入
前文已经介绍了数据输出,现在继续介绍数据输入,这里所说的数据输入,是指如何得到从键盘上输入的数据。
3.2.1 字符输入函数getchar
首先,我们介绍一下字符型数据的输入,在C库中有专门的字符输入函数。
头文件:stdio.h
函数原型:int getchar(void)
函数参数:无
函数返回值:成功,返回读到的字符,失败或读到结束符返回EOF(-1)
函数功能:在键盘上读一个字符。
getchar是函数返回值的含义是存储从键盘上读取的字符,返回值的类型确是int,很多人不理解,认为返回值应该是char类型。实际上这里返回的是相应字符的ASCII码,在计算机中字符是以ASCII码的形式处理的,每个字符对应一个ASCII码值。
示例代码如下:
#include <stdio.h>
int main()
{int ch;printf("Enter a character:");while((ch==getchar())!=EOF){printf("%c--->%#x\n",ch,ch);}printf("end main\n");return 0;
}
3.2.2 格式化输入函数scanf
getchar函数只能从键盘读到一个字符型的数据,如果期望读到若干个数据,且为任意类型,可以用scanf函数
头文件:stdio.h
函数原型:int scanf(const char *format,…)
函数参数:format 指定输入格式,后面跟要输入的变量的地址表,为不定参,用…代表。
函数返回值:成功返回输入的变量的个数,失败返回-1(EOF)
函数功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车结束
目前,scanf支技的格式字符很多。
scanf函数支持的格式说明符
i,d | 十进制整数 | c | 单一字符 |
---|---|---|---|
x,X | 十六进制无符号整数 | s | 字符串 |
o | 八进制无符号整数 | e | 指数形式浮点小数 |
u | 无符号十进制整数 | f | 小数形式浮点小数 |
scanf函ovgt支持的格式说明符的修饰符
修饰符 | 功能 |
---|---|
h | 用于d,o,x前,指定输入为short型整数 |
l | 用于d,o,x前,指定输入为long型整数 |
l | 用于e,f前,指定输入为double型实数 |
m | 指定输入数据宽度,遇空格或不可转换字符结束 |
* | 抑制符,指定输入项读入后不赋给变量 |
示例代码
#include<stdio.h>
int main()
{int a,b,c;printf("input a b c:");scanf("%d",&a);scanf("%x",&b);scanf("%o",&c);printf("a=%d,b=%d,c=%d\n",a,b,c);return 0;
}
格式说明符修饰符的例子
#include <stdio.h>
int main()
{int yy,mm,dd;int a;float c;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);//4d指定输入项中4个数字读入后不赋给变量printf("a=%d,c=%f\n",a,c);return 0;
}
[ben@ben-pc c_workspace]$ ./a.out
input year month day2012 12 26
2012-12-26
input int float:9 9.1234
a=9,c=0.123400
[ben@ben-pc c_workspace]$ ./a.out
input year month day2012 12 26
2012-12-26
input int float:1234567890
a=123,c=890.000000
关于scanf函数有一些特另需要注意的地方。
- 用“%c”格式符时,空格和转义字符作为有效的字符输入。
示例代码
#include<stdio.h>
int main()
{char ch1,ch2,ch3;printf("input three characters:");scanf("%c%c%c",&ch1,&ch2,&ch3);printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3);return 0;
}
[ben@ben-pc temp]$ ./a.out
input three characters:a b c
ch1=a,ch2= ,ch3=b
[ben@ben-pc temp]$ ./a.out
input three characters:a\tb
ch1=a,ch2=\,ch3=t
- 输入数据时,遇到以下情竞认该数据结束
- 空格 TAB 回车
- 宽度结束
- 非法输入
- scanf函数反回值是成功输入的变量的个数,当遇到非法输入时,返回值会小于实际变量个数
- 使用输入函数可能会留下垃圾
- 调用getchar清除垃圾字符。
- 用格式串中空格或"%*c"来"吃掉"
scanf("%*c%c",&ch);
3.3 数据输入输出综合示例
3-1输入三角形的三条边长a,b,c,计算三角形的面积area计算公式如下:
s=(a+b+c)/2s=(a+b+c)/2s=(a+b+c)/2
area=s∗(s−a)∗(s−b)∗(s−c)area=\sqrt{s*(s-a)*(s-b)*(s-c)}area=s∗(s−a)∗(s−b)∗(s−c)
#include<stdio.h>
#include<math.h>
int main()
{float a,b,c,s,area;scanf("%f%f%f",&a,&b,&c);s = 1.0/2*(a+b+c);area = sqrt(s*(s-a)*(s-b)*(s-c));printf("a=%7.2f,b=%7.2f,c=%7.2f\n",a,b,c);printf("area = %7.2f\n",area);return 0;
}
#-lm连接c的数学库
[ben@ben-pc temp]$ gcc ./temp3.c -lm
[ben@ben-pc temp]$ ./a.out
3 4 6
a= 3.00,b= 4.00,c= 6.00
area = 5.33
3-2 从键盘上输入a,b,c的值,求一元二次方程ax2+bx+c=0ax^2+bx+c = 0ax2+bx+c=0的根,
x1=−b+b2−4ac2a,x2=−b−b2−4ac2a
x_1=\frac{-b+\sqrt{b^2-4ac}}{2a}
,
x_2=\frac{-b-\sqrt{b^2-4ac}}{2a}
x1=2a−b+b2−4ac,x2=2a−b−b2−4ac
#include <math.h>
#include <stdio.h>
int main()
{float a,b,c,disc,x1,x2,p,q;scanf("%f%f%f",&a,&b,&c);disc = b*b-4*a*c;p = -b/(2*a);q = sqrt(disc)/(2*a);x1 = p+q;x2 = p-q;printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);return 0;
}
[ben@ben-pc temp]$ ./a.out
1 3 2x1=-1.00
x2=-2.00
3.4字符串输入输出函数
(1)字符串输出函数puts
头文件:stdio.h
函数原型:int puts(const char *s)
功能:在标准输出上显示字符串s
参数:s为需要输出的字符串
返回值:成功返回一个非0的数字,失败返回-1或EOF
#include <stdio.h>
int main()
{char s[]="welcome";puts(s);return 0;
}
puts函数在输出字符串时地,会自动追加换行字符’\n’。使用时,注意字符数组必须以’\0’结束
(2)字符串输入函数fgets
头文件:stdio.h
函数原型:char* gets(char* s,int size,FILE *stream)
功能:从键盘输入一以回结束的字符串放入字符数组中,并自动加上‘\0’
参数:s为字符数组,存储输入的字符串,size要读取的字符数包含‘\0’,stream是指向FILE的指针。该FILE标识了要从中读取的字符流。
返回值:成功返回字符数组的起始地址,失败或输入结束返回NULL
#include<stdio.h>
#define N 20
int main()
{int i = 0;char s[N] = {0};printf(">");while(fgets(s,N,stdin)!=NULL){printf(">");printf("i=%d:%s\n",i,s);i++;}printf("end main\n");return 0;
}