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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

C
九州編程 2019-07-25 14:14:39
c-canf()vs get()vs fget()我一直在做一個(gè)相當(dāng)簡(jiǎn)單的程序,將字符串(假設(shè)輸入了數(shù)字)轉(zhuǎn)換為Integer。在我做完之后,我注意到一些我無法回答的非常奇怪的“bug”,主要是因?yàn)槲覍?duì)scanf(), gets()和fgets()功能起作用。(不過,我確實(shí)讀過很多文獻(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é)果有點(diǎn)錯(cuò)誤,因?yàn)楹苊黠@fgets()函數(shù)最后讀取換行符(ASCII值10),這會(huì)導(dǎo)致結(jié)果混亂。第三,當(dāng)使用scanf()函數(shù),結(jié)果是完全錯(cuò)誤的,因?yàn)榈谝粋€(gè)字符顯然有一個(gè)-52的ASCII值.對(duì)此,我沒有任何解釋。現(xiàn)在我知道了gets()不鼓勵(lì)使用,所以我想知道我是否可以使用fgets()在這里,它不會(huì)讀取(或忽略)換行符。還有,那是怎么回事scanf()在這個(gè)程序中起作用?
查看完整描述

3 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

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

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

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




查看完整回答
反對(duì) 回復(fù) 2019-07-26
?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊

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

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




查看完整回答
反對(duì) 回復(fù) 2019-07-26
  • 3 回答
  • 0 關(guān)注
  • 513 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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