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

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

如何防止掃描導(dǎo)致C中的緩沖區(qū)溢出?

如何防止掃描導(dǎo)致C中的緩沖區(qū)溢出?

C++ C
叮當(dāng)貓咪 2019-06-10 20:22:49
如何防止掃描導(dǎo)致C中的緩沖區(qū)溢出?我使用以下代碼:while ( scanf("%s", buf) == 1 ){防止可能的緩沖區(qū)溢出從而傳遞隨機(jī)長度字符串的最佳方法是什么?我知道可以通過調(diào)用以下命令來限制輸入字符串:while ( scanf("%20s", buf) == 1 ){但我更希望能夠處理用戶輸入的任何內(nèi)容?;蛘哌@不能安全地使用scanf,我應(yīng)該使用fget?
查看完整描述

3 回答

?
精慕HU

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

在他們的書里編程實踐(這很值得一讀),克尼漢和派克討論了這個問題,他們用snprintf()創(chuàng)建具有正確緩沖區(qū)大小的字符串以傳遞到scanf()功能家族。實際上:

int scanner(const char *data, char *buffer, size_t buflen){
    char format[32];
    if (buflen == 0)
        return 0;
    snprintf(format, sizeof(format), "%%%ds", (int)(buflen-1));
    return sscanf(data, format, buffer);}

注意,這仍然將輸入限制在作為“緩沖區(qū)”提供的大小上。如果您需要更多的空間,那么您必須進(jìn)行內(nèi)存分配,或者使用一個非標(biāo)準(zhǔn)的庫函數(shù)來為您分配內(nèi)存。


注意,POSIX 2008(2013)版scanf()函數(shù)族支持格式修飾符m(賦值-分配字符)用于字符串輸入(%s%c%[)。而不是采取char *爭論,這需要一個char **參數(shù),并為其讀取的值分配必要的空間:

char *buffer = 0;if (sscanf(data, "%ms", &buffer) == 1){
    printf("String is: <<%s>>\n", buffer);
    free(buffer);}

如果sscanf()函數(shù)無法滿足所有轉(zhuǎn)換規(guī)范,然后它為其分配的所有內(nèi)存。%ms-在函數(shù)返回之前釋放類似的轉(zhuǎn)換。


查看完整回答
反對 回復(fù) 2019-06-10
?
MYYA

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

如果您正在使用GCC,則可以使用GNU分機(jī)。a為您分配內(nèi)存以保存輸入的說明符:

int main(){
  char *str = NULL;

  scanf ("%as", &str);
  if (str) {
      printf("\"%s\"\n", str);
      free(str);
  }
  return 0;}

編輯:正如喬納森所指出的,您應(yīng)該咨詢scanf說明符可能與手冊頁不同(%m),您可能需要在編譯時啟用某些定義。


查看完整回答
反對 回復(fù) 2019-06-10
?
素胚勾勒不出你

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

在大多數(shù)情況下,fgetssscanf做這份工作。另一件事是編寫自己的解析器,如果輸入格式化良好的話。還請注意,您的第二個示例需要進(jìn)行一些修改才能安全地使用:

#define LENGTH          42#define str(x)          # x#define xstr(x)       
  str(x)/* ... */ int nc = scanf("%"xstr(LENGTH)"[^\n]%*[^\n]", array);

上面的輸入流向上丟棄,但不包括換行符(\n)性格。您將需要添加一個getchar()來消費(fèi)這個。還請檢查是否到達(dá)了流的末尾:

if (!feof(stdin)) { ...

僅此而已。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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