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