学习自李慧琴老师
实验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 的格式,因为当从终端或者文件中拿数据的时候,我们是不清楚有待拿出来的字符串有多长的