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 的格式,因爲當從終端或者文件中拿數據的時候,我們是不清楚有待拿出來的字符串有多長的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章