Linux系统编程7标准IO - printf和scanf

学习自李慧琴老师


实验1 ,atoi(),将字符串转换为整型
实验2:snprintf(),将多个类型综合转换为字符串,可以将snprintf() 看成 atoi()的反向。


1 printf系列

man 3 printf

int printf(const char *format, …);
int fprintf(FILE *stream, const char *format, …);
int sprintf(char *str, const char *format, …);
int snprintf(char *str, size_t size, const char *format, …);

1 int printf(const char *format, …); //将输出项以format格式输出到标准输出
2 int fprintf(FILE *stream, const char *format, …); //将输出项以format格式输出到指定流stream,类似于重定向

在这里插入图片描述

3 int sprintf(char *str, const char *format, …); //将输出项以format格式输出到指定字符串
注意 : sprintf()不检查缓冲区溢出
延伸 int atoi(const char *nptr); //将字符串转换为一个整型数

实验1 ,atoi(),将字符串转换为整型

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	char str[] = "123456";

	printf("%d\n",atoi(str));
	exit(0);
}
mhr@ubuntu:~/work/linux/stdio$ 
mhr@ubuntu:~/work/linux/stdio$ gcc atoi.c 
mhr@ubuntu:~/work/linux/stdio$ ./a.out 
123456
mhr@ubuntu:~/work/linux/stdio$ 

注意如果字符串中间存在字母的话,atoi()会将字母前的字符串转换为整型数,后面的不要。

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	char str[] = "123a456";

	printf("%d\n",atoi(str));
	exit(0);
}
mhr@ubuntu:~/work/linux/stdio$ 
mhr@ubuntu:~/work/linux/stdio$ gcc atoi.c 
mhr@ubuntu:~/work/linux/stdio$ ./a.out 
123
mhr@ubuntu:~/work/linux/stdio$ 

4 int snprintf(char *str, size_t size, const char *format, …);
snprintf()是用来解决 sprintf()的一个问题,即sprintf()不检查缓冲区的溢出。类似于用 fgets() 来代替 gets()。因为 gets()不检查缓冲区的溢出。snprintf()指定了 str字符串的大小,防止溢出。

但是 并没有解决问题,由于担心 sprintf()中的 str字符串空间溢出,所以做了一个 snprintf(),可是snprintf()中只是指定了 str字符串空间的大小,提醒用户不要存储多余这个容量的字符串。但是如果我们准备放进字符串空间中的的数据就是比较长该怎么办?这样的问题同样存在于 fgets()中。

实验2:snprintf(),将多个类型综合转换为字符串,可以将snprintf() 看成 atoi()的反向。

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	char buf[1024];

	int year = 2020,month = 4,day = 20;


	sprintf(buf,"%d-%d-%d",year,month,day);
	puts(buf);
	exit(0);
}
mhr@ubuntu:~/work/linux/stdio$ gcc atoi.c 
mhr@ubuntu:~/work/linux/stdio$ ./a.out 
2020-4-20
mhr@ubuntu:~/work/linux/stdio$ 

2 scanf系列

#include <stdio.h>

   int scanf(const char *format, ...);
   int fscanf(FILE *stream, const char *format, ...);
   int sscanf(const char *str, const char *format, ...);

1 : int scanf(const char *format, …);//从终端(标准输入) 拿数据 以 format格式存储到 目标地址
2 : int fscanf(FILE *stream, const char *format, …); //从指定流中拿数据 以 format格式存储到 目标地址
3 : int sscanf(const char *str, const char *format, …);//从指定字符串中拿数据 以 format格式存储到 目标地址

注意:在scanf()一系列函数中,要慎重使用%s 的格式,因为当从终端或者文件中拿数据的时候,我们是不清楚有待拿出来的字符串有多长的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值