1、使用區(qū)別
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的塔河網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
scanf()不會(huì)檢查輸入邊界,可能造成數(shù)據(jù)溢出。
scanf_s()會(huì)進(jìn)行邊界檢查。
2、意思
scanf表示從鍵盤輸入指定格式的數(shù)據(jù)。如:scanf("%d",x);指從鍵盤給x輸入一個(gè)int型(整型)數(shù)據(jù);scanf("%f",x);指從鍵盤給x輸入一個(gè)float型(實(shí)型)數(shù)據(jù);
對(duì)應(yīng)的輸出為:printf?按照指定的格式輸出數(shù)據(jù);如printf("%d",x);?指按整型數(shù)據(jù)輸出X中的值。
因?yàn)閹А癬s”后綴的函數(shù)是為了讓原版函數(shù)更安全,傳入一個(gè)和參數(shù)有關(guān)的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統(tǒng)。
3、scanf_s()參數(shù)與scanf()不同
例如scanf(“%s”,name,n),整形n為name類型的大小,如果name是數(shù)組,那n就是該數(shù)組的大小。
scanf是C語言中的標(biāo)準(zhǔn)輸入函數(shù)。
函數(shù)原型如下:
int scanf( const char *format, ... );
其調(diào)用格式為: scanf("格式化字符串",地址表);
舉例說明如下:
1
scanf("%d%d", a, b); // 接收用戶從鍵盤輸入的2個(gè)整數(shù),分別賦值給變量a,b
還需要注意的就是scanf函數(shù)的返回值:
對(duì)于 scanf("%d%d", a, b);
如果a和b都被成功讀入,那么scanf的返回值就是2 ;
如果只有a被成功讀入,返回值為1 ;
如果a和b都未被成功讀入,返回值為0 ;
如果遇到錯(cuò)誤或遇到end of file,返回值為EOF。
是取地址,scanf讀取變量的時(shí)候,參數(shù)需要的是變量的實(shí)際內(nèi)存地址。
與printf函數(shù)一樣,都被聲明在頭文件stdio.h里,因此在使用scanf函數(shù)時(shí)要加上#include stdio.h。
在有一些實(shí)現(xiàn)中,printf函數(shù)與scanf函數(shù)在使用時(shí)可以不使用預(yù)編譯命令#include stdio.h。是格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。
擴(kuò)展資料:
對(duì)于字符串?dāng)?shù)組或字符串指針變量,由于數(shù)組名可以轉(zhuǎn)換為數(shù)組和指針變量名本身就是地址,因此使用scanf()函數(shù)時(shí),不需要在它們前面加上""操作符。
可以在格式化字符串中的"%"各格式化規(guī)定符之間加入一個(gè)整數(shù),表示任何讀操作中的最大位數(shù)。scanf函數(shù)中沒有類似printf的精度控制。如: scanf("%5.2f",a); 是非法的。不能企圖用此語句輸入小數(shù)為2位的實(shí)數(shù)。
scanf中要求給出變量地址,如給出變量名則會(huì)出錯(cuò),如 scanf("%d",a);是非法的,應(yīng)改為scanf("%d",a);才是合法的。
C語言輸入輸出函數(shù)有很多,標(biāo)準(zhǔn)I/O函數(shù)中包含了如下幾個(gè)常用的函數(shù):
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
int
getc(FILE
*fp)
getc主要是從文件中讀出一個(gè)字符.常用的判斷文件是否讀取結(jié)束的語句為
(ch
=
getc(fp))
!=
EOF.EOF為文件結(jié)束標(biāo)志,定義在stdio.h中,就像EXIT_SUCCESS,EXIT_FAILURE定義在stdlib.h中一樣,文件也可以被理解為一種流,所以當(dāng)fp為stdin時(shí),getc(stdin)就等同于getchar()了.
int
putc(int
ch,FILE
*fp)
putc主要是把字符ch寫到文件fp中去.如果fp為stdout,則putc就等同于putchar()了.
int
getchar(void)
getchar主要是從標(biāo)準(zhǔn)輸入流讀取一個(gè)字符.默認(rèn)的標(biāo)準(zhǔn)輸入流即stdio.h中定義的stdin.但是從輸入流中讀取字符時(shí)又涉及到緩沖的問題,所以并不是在屏幕中敲上一個(gè)字符程序就會(huì)運(yùn)行,一般是通過在屏幕上敲上回車鍵,然后將回車前的字符串放在緩沖區(qū)中,getchar就是在緩沖區(qū)中一個(gè)一個(gè)的讀字符.當(dāng)然也可以在while循環(huán)中指定終止字符,如下面的語句:while
((c
=
getchar())
!=
'#')這是以#來結(jié)束的.
int
putchar(int
ch)
putchar(ch)主要是把字符ch寫到標(biāo)準(zhǔn)流stdout中去.
char
*
gets(char
*str)
gets主要是從標(biāo)準(zhǔn)輸入流讀取字符串并回顯,讀到換行符時(shí)退出,并會(huì)將換行符省去.
int
puts(char
*str)
puts主要是把字符串str寫到標(biāo)準(zhǔn)流stdout中去,并會(huì)在輸出到最后時(shí)添加一個(gè)換行符.
char
*fgets(char
*str,
int
num,
FILE
*fp)
str是存放讀入的字符數(shù)組指針,num是最大允許的讀入字符數(shù),fp是文件指針.fgets的功能是讀一行字符,該行的字符數(shù)不大于num-1.因?yàn)閒gets函數(shù)會(huì)在末尾加上一個(gè)空字符以構(gòu)成一個(gè)字符串.另外fgets在讀取到換行符后不會(huì)將其省略.
int
fputs(char
*str,
file
*fp)
fputs將str寫入fp.fputs與puts的不同之處是fputs在打印時(shí)并不添加換行符.
int
fgetc(FILE
*fp)
fgetc從fp的當(dāng)前位置讀取一個(gè)字符.
int
fputc(int
ch,
file
*fp)
fputc是將ch寫入fp當(dāng)前指定位置.
int
fscanf(FILE
*fp,
char
*format,
輸入列表)
fscanf按照指定格式從文件中出讀出數(shù)據(jù),并賦值到參數(shù)列表中.
int
fprintf(FILE
*fp,
char
*format,
輸出列表)
fprintf將格式化數(shù)據(jù)寫入流式文件中.
數(shù)據(jù)塊讀寫函數(shù)
fread
(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
參數(shù)說明:
buffer:是一個(gè)指針。
對(duì)fread
來說,它是讀入數(shù)據(jù)的存放地址。
對(duì)fwrite來說,是要輸出數(shù)據(jù)的地址(均指起始地址)。
size:
要讀寫的字節(jié)數(shù)。
count:
要進(jìn)行讀寫多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)。
fp:
文件型指針。
scanf是C語言中的標(biāo)準(zhǔn)輸入函數(shù)。
int
scanf(
const
char
*format,
...
);
其調(diào)用格式為:
scanf("格式化字符串",地址表);
scanf函數(shù)的返回值:
對(duì)于
scanf("%d%d",
a,
b);
如果a和b都被成功讀入,那么scanf的返回值就是2
;
如果只有a被成功讀入,返回值為1
;
如果a和b都未被成功讀入,返回值為0
;
如果遇到錯(cuò)誤或遇到end
of
file,返回值為EOF。
屏幕上輸入的字符,會(huì)暫存到緩存。不信,你可以一直按著鍵盤,不多會(huì),你就會(huì)聽到系統(tǒng)發(fā)出嘟嘟的報(bào)警聲,說明緩沖區(qū)已經(jīng)滿了。
scanf()函數(shù)只是從當(dāng)前緩沖區(qū)取一個(gè)相應(yīng)的字符;其中緩沖區(qū)的最后一個(gè)字符為'\n';
按你說的,可以用循環(huán),接收字符同樣可以用getchar()函數(shù)。
char
ch;
執(zhí)行一個(gè)shell命令行時(shí)通常會(huì)自動(dòng)打開三個(gè)標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件(stdin),通常對(duì)應(yīng)終端的鍵盤;
標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)錯(cuò)誤輸出文件(stderr),這兩個(gè)文件都對(duì)應(yīng)終端的屏幕。進(jìn)程將從標(biāo)準(zhǔn)輸入文件中得到輸入數(shù)據(jù),將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯(cuò)誤信息送到標(biāo)準(zhǔn)錯(cuò)誤文件中。