第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

c-canf()vs get()vs fget()

c-canf()vs get()vs fget()

C
慕無忌1623718 2019-10-12 16:07:54
c-canf()vs get()vs fget()我一直在做一個相當(dāng)簡單的程序,將字符串(假設(shè)輸入了數(shù)字)轉(zhuǎn)換為Integer。在我做完之后,我注意到一些我無法回答的非常奇怪的“bug”,主要是因為我對scanf(), gets()和fgets()功能起作用。(不過,我確實讀過很多文獻(xiàn)。)因此,在不寫太多文字的情況下,下面是程序的代碼:#include <stdio.h>#define MAX 100int CharToInt(const char *);int main(){     char str[MAX];     printf(" Enter some numbers (no spaces): ");     gets(str);//  fgets(str, sizeof(str), stdin);//  scanf("%s", str);     printf(" Entered number is: %d\n", CharToInt(str));     return 0;}int CharToInt(const char *s){     int i, result, temp;     result = 0;     i = 0;     while(*(s+i) != '\0')     {         temp = *(s+i) & 15;         result = (temp + result) * 10;         i++;     }     return result / 10;}這就是我一直面臨的問題。首先,當(dāng)使用gets()功能,程序工作得很完美。第二,當(dāng)使用fgets(),結(jié)果有點錯誤,因為很明顯fgets()函數(shù)最后讀取換行符(ASCII值10),這會導(dǎo)致結(jié)果混亂。第三,當(dāng)使用scanf()函數(shù),結(jié)果是完全錯誤的,因為第一個字符顯然有一個-52的ASCII值.對此,我沒有任何解釋?,F(xiàn)在我知道了gets()不鼓勵使用,所以我想知道我是否可以使用fgets()在這里,它不會讀取(或忽略)換行符。還有,那是怎么回事scanf()在這個程序中起作用?
查看完整描述

3 回答

?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗 獲得超10個贊

  • 絕不可能使用gets..它不提供針對緩沖區(qū)溢出漏洞的保護(hù)(也就是說,您不能告訴它您傳遞給它的緩沖區(qū)有多大,因此它不能阻止用戶進(jìn)入大于緩沖區(qū)的行并破壞內(nèi)存)。

  • 避免使用scanf..如果不小心使用,它可能會出現(xiàn)與以下相同的緩沖區(qū)溢出問題:gets..即使忽略了這一點,它還有其他問題,使它很難正確使用。.

  • 通常您應(yīng)該使用fgets相反,盡管有時很不方便(您必須去掉換行符,您必須提前確定緩沖區(qū)大小,然后您必須弄清楚如何處理太長的行-您是否保留了所讀的部分和丟棄多余的,丟棄整件事,動態(tài)增長緩沖區(qū),然后再試一次,等等)。有一些非標(biāo)準(zhǔn)的函數(shù)可以為您執(zhí)行這種動態(tài)分配。getline關(guān)于POSIX系統(tǒng),查克·法爾科納的公共領(lǐng)域ggets職能)。請注意ggetsgets-就像語義學(xué)一樣,它為你剝?nèi)チ艘粋€尾隨的換行符。



查看完整回答
反對 回復(fù) 2019-10-13
?
搖曳的薔薇

TA貢獻(xiàn)1793條經(jīng)驗 獲得超6個贊

是的,你想避免getsfgets將始終讀取新行,如果緩沖區(qū)足夠大,足以容納它(這會讓您知道緩沖區(qū)太小,并且有更多的行等待讀取)。如果你想要fgets它不會讀取新行(丟失太小緩沖區(qū)的指示),您可以使用fscanf具有如下的掃描集轉(zhuǎn)換:"%N[^\n]",其中‘N’替換為緩沖區(qū)大小-1。

在讀取完后,一種簡單(如果奇怪)方法可以從緩沖區(qū)中刪除拖尾的新行。fgets是:strtok(buffer, "\n");不是這樣的strtok是打算被使用的,但我用這種方式比以預(yù)期的方式使用它的頻率要高(我通常避免使用這種方式)。



查看完整回答
反對 回復(fù) 2019-10-13
  • 3 回答
  • 0 關(guān)注
  • 339 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號