当前位置: 首页 > news >正文

嵌入式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无符号十进制整数ge和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函数有一些特另需要注意的地方。

  1. 用“%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
  1. 输入数据时,遇到以下情竞认该数据结束
  • 空格 TAB 回车
  • 宽度结束
  • 非法输入
  1. scanf函数反回值是成功输入的变量的个数,当遇到非法输入时,返回值会小于实际变量个数
  2. 使用输入函数可能会留下垃圾
  • 调用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(sa)(sb)(sc)

#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=2ab+b24ac,x2=2abb24ac

#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;
}
http://www.dtcms.com/a/392956.html

相关文章:

  • 【记录】初赛复习 Day5 6(2021S第一轮错题,内附深井题目讲解)
  • 【C++】类和对象—(下) 收官之战
  • 人工智能学习:什么是迁移学习
  • 模型进阶与神经网络
  • 微软.NET离线运行库合集 v2025.09.09_Win中文_NET运行库_安装教程
  • Galileo AI-AI驱动的UI界面设计工具
  • 布谷鸟布隆过滤器和计数式布隆过滤器和原始布隆过滤器相比分别解决了什么问题?
  • 大模型介绍
  • 基于Springboot的无人之境智能酒店服务平台
  • ICCV-2025 | 大模型驱动的认知导航框架!CogNav:面向目标导航的大型语言模型驱动的认知过程建模
  • java-异常
  • 网络编程:一个 TCP 服务器的简易实现(epoll 版本)
  • 【MySQL学习】关于MySql语句执行、查询、更新流程原理总结
  • C++语法深度剖析与面试核心详解
  • 【Tomcat】基础总结:类加载机制
  • 127、【OS】【Nuttx】【周边】效果呈现方案解析:比较浮点数(上)
  • 计网协议簇具体协议
  • 电路分析基础笔记
  • 【JVM 常用工具命令大全】
  • 从iload_1 iload_2 iadd字节码角度看jvm字节码执行
  • openssl 启用AES NI加速对AES加密性能影响的测试
  • LeetCode:32.随机链表的复制
  • 基于SpringBoot+Vue的旅游系统【协同过滤推荐算法+可视化统计】
  • 前端实现一个星空特效的效果(实战+讲解)
  • 【嵌入式】【科普】软件模块设计简介
  • 【ROS2】ROS2通讯机制Topic常用命令行
  • 欧姆龙NJ系列PLC编程标准化案例
  • 【OpenGL】LearnOpenGL学习笔记25 - 法线贴图 NormalMap
  • UE5 基础应用 —— 09 - 行为树 简单使用
  • 客户端实现信道管理