精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在 C 語言中安全地讀取用戶輸入

開發
getline() 提供了一種更靈活的方法,可以在不破壞系統的情況下將用戶數據讀入程序。

在 C 語言中讀取字符串是一件非常危險的事情。當讀取用戶輸入時,程序員可能會嘗試使用 C 標準庫中的 gets 函數。它的用法非常簡單:

char *gets(char *string);

gets() 從標準輸入讀取數據,然后將結果存儲在一個字符串變量中。它會返回一個指向字符串的指針,如果沒有讀取到內容,返回 NULL 值。

舉一個簡單的例子,我們可能會問用戶一個問題,然后將結果讀入字符串中:

#include <stdio.h>
#include <string.h>
int main()
{
  char city[10]; // 例如 "Chicago"
  // 這種方法很糟糕 .. 不要使用 gets
  puts("Where do you live?");
  gets(city);
  printf("<%s> is length %ld\n", city, strlen(city));
  return 0;
}

輸入一個相對較短的值就可以:

Where do you live?
Chicago
<Chicago> is length 7

然而,gets() 函數非常簡單,它會天真地讀取數據,直到它認為用戶完成為止。但是它不會檢查字符串是否足夠容納用戶的輸入。輸入一個非常長的值會導致 gets() 存儲的數據超出字符串變量長度,從而導致覆蓋其他部分內存。

Where do you live?
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
<Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch> is length 58
Segmentation fault (core dumped)

最好的情況是,覆蓋部分只會破壞程序。最壞的情況是,這會引入一個嚴重的安全漏洞,惡意用戶可以通過你的程序將任意數據插入計算機的內存中。

這就是為什么在程序中使用 gets() 函數是危險的。使用 gets(),你無法控制程序嘗試從用戶讀取多少數據,這通常會導致緩沖區溢出。

安全的方法

fgets() 函數歷來是安全讀取字符串的推薦方法。此版本的 gets() 提供了一個安全檢查,通過僅讀取作為函數參數傳遞的特定數量的字符:

char *fgets(char *string, int size, FILE *stream);

fgets() 函數會從文件指針讀取數據,然后將數據存儲到字符串變量中,但最多只能達到 size 指定的長度。我們可以更新示例程序來測試這一點,使用 fgets() 而不是 gets()

#include <stdio.h>
#include <string.h>
int main()
{
    char city[10]; // 例如 "Chicago"
    puts("Where do you live?");
    // fgets 雖好但是并不完美
    fgets(city, 10, stdin);
    printf("<%s> is length %ld\n", city, strlen(city));
    return 0;
}

如果編譯運行,你可以在提示符后輸入任意長的城市名稱。但是,程序只會讀取 size = 10 數據存儲到字符串變量中。因為 C 語言在字符串末尾會添加一個空(\0)字符,這意味著 fgets() 只會讀取 9 個字符到字符串中。

Where do you live?
Minneapolis
<Minneapol> is length 9

雖然這肯定比 fgets() 讀取用戶輸入更安全,但代價是如果用戶輸入過長,它會“切斷”用戶輸入。

新的安全方法

更靈活的解決方案是,如果用戶輸入的數據比變量可能容納的數據多,則允許字符串讀取函數為字符串分配更多內存。根據需要調整字符串變量大小,確保程序始終有足夠的空間來存儲用戶輸入。

getline() 函數正是這樣。它從輸入流讀取輸入,例如鍵盤或文件,然后將數據存儲在字符串變量中。但與 fgets() 和 gets() 不同,getline() 使用 realloc() 調整字符串大小,確保有足夠的內存來存儲完整輸入。

ssize_t getline(char **pstring, size_t *size, FILE *stream);

getline() 實際上是一個名為 getdelim() 的類似函數的裝飾器,它會讀取數據一直到特殊分隔符停止。本例中,getline() 使用換行符(\n)作為分隔符,因為當從鍵盤或文件讀取用戶輸入時,數據行由換行符分隔。

結果證明這是一種更安全的方法讀取任意數據,一次一行。要使用 getline(),首先定義一個字符串指針并將其設置為 NULL ,表示還沒有預留內存,再定義一個 size_t 類型的“字符串大小” 的變量,并給它一個零值。當你調用 getline() 時,你需要傳入字符串和字符串大小變量的指針,以及從何處讀取數據。對于示例程序,我們可以從標準輸入中讀取:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
  char *string = NULL;
  size_t size = 0;
  ssize_t chars_read;
  // 使用 getline 讀取長字符串
  puts("Enter a really long string:");
  chars_read = getline(&string, &size, stdin);
  printf("getline returned %ld\n", chars_read);
  // 檢查錯誤
  if (chars_read < 0) {
    puts("couldn't read the input");
    free(string);
    return 1;
  }
  // 打印字符串
  printf("<%s> is length %ld\n", string, strlen(string));
  // 釋放字符串使用的內存
  free(string);
  return 0;
}

使用 getline() 讀取數據時,它將根據需要自動為字符串變量重新分配內存。當函數讀取一行的所有數據時,它通過指針更新字符串的大小,并返回讀取的字符數,包括分隔符。

Enter a really long string:
Supercalifragilisticexpialidocious
getline returned 35
<Supercalifragilisticexpialidocious
> is length 35

注意,字符串包含分隔符。對于 getline(),分隔符是換行符,這就是為什么輸出中有換行符的原因。 如果你不想在字符串值中使用分隔符,可以使用另一個函數將字符串中的分隔符更改為空字符。

通過 getline(),程序員可以安全地避免 C 編程的一個常見陷阱:你永遠無法知道用戶可能會輸入哪些數據。這就是為什么使用 gets() 不安全,而 fgets() 又太笨拙的原因。相反,getline() 提供了一種更靈活的方法,可以在不破壞系統的情況下將用戶數據讀入程序。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2019-04-11 08:00:00

Windows刪除文件

2022-12-25 10:09:44

2016-05-11 14:16:20

2018-03-21 07:08:40

2022-10-12 15:15:56

數字孿生物聯網

2014-06-06 14:33:29

BYOD移動安全

2022-07-04 10:11:33

云安全混合云云計算

2024-03-14 11:22:54

2010-03-11 19:16:32

Python語言

2024-01-10 17:27:00

Python開發

2021-09-14 09:00:00

私有云安全云架構

2019-06-17 08:00:55

multipassbash腳本

2019-03-21 10:15:57

Windows 10關閉計算機Windows

2022-05-18 07:09:35

C#語言架構

2023-10-11 17:38:43

Linux磁盤數據

2019-12-13 11:30:33

云計算IT安全

2013-12-30 10:43:15

云計算移動數據云安全

2024-10-10 15:08:40

2023-04-01 10:32:36

2024-01-22 16:38:00

AI人工智能GenAI
點贊
收藏

51CTO技術棧公眾號

久久久久成人黄色影片| 国产一区二区三区久久| 欧美一区二区三区男人的天堂| 色一情一乱一伦一区二区三区| 亚洲一级特黄毛片| 这里只有精品在线| 亚洲福利在线视频| 欧美性猛交xxx乱久交| 免费**毛片在线| 成人福利视频在线看| 国产精品扒开腿做爽爽爽的视频| 久久精品在线观看视频| 亚洲综合网狠久久| 在线欧美一区二区| 免费高清一区二区三区| h视频网站在线观看| 成人性色生活片| 国产精品午夜一区二区欲梦| 日韩精品视频免费播放| 婷婷久久一区| 亚洲人成亚洲人成在线观看| 三级av免费看| 成人福利片在线| 一区二区理论电影在线观看| 日韩精品久久久免费观看| 亚洲爱情岛论坛永久| 蜜臀av一级做a爰片久久| 5566日本婷婷色中文字幕97| 久草成人在线视频| 999精品视频| 亚洲欧美制服第一页| 亚洲av无码专区在线播放中文| www.一区| 欧美影视一区在线| 国产综合免费视频| 2018av在线| 亚洲制服欧美中文字幕中文字幕| 一区二区三区四区五区精品| 欧洲一级在线观看| 91伊人久久大香线蕉| 成人性色av| 国产毛片一区二区三区va在线| 日韩电影在线观看网站| 浅井舞香一区二区| www欧美在线| 国产日韩亚洲欧美精品| 97欧美精品一区二区三区| 久久精品一级片| 欧美激情日韩| 欧美日韩第一视频| 欧美激情精品久久| 欧美91视频| 九九精品视频在线| 久久久精品99| 亚洲激情专区| 91国内在线视频| 国偷自拍第113页| 亚洲综合社区| 国产成人午夜视频网址| 无码人妻精品一区二区蜜桃色欲| 久久久一二三| 国产精品狠色婷| 中文无码精品一区二区三区| 奇米四色…亚洲| 国产精品综合不卡av| 亚洲综合视频在线播放| 精品亚洲aⅴ乱码一区二区三区| 国产美女搞久久| 国产欧美久久久精品免费| 国产精品综合久久| 国产精品香蕉视屏| 伦理片一区二区三区| 欧美激情一区二区| 精品久久免费观看| 国产黄色大片在线观看| 婷婷开心久久网| 一本久道综合色婷婷五月| 99九九久久| 日韩一区二区视频在线观看| 精品国产乱码久久久久夜深人妻| 嫩草国产精品入口| 中文字幕不卡av| 国产这里有精品| 亚洲伦理精品| 国产精品一区二区三区毛片淫片| 国产又粗又长视频| 成人精品免费网站| 欧洲国产精品| 婷婷丁香在线| 日韩欧美国产一区二区| 中日韩av在线播放| 国产精品对白| 自拍亚洲一区欧美另类| 免费无码毛片一区二区app| 性欧美长视频| 91久久精品日日躁夜夜躁国产| 高h放荡受浪受bl| 欧美极品xxx| 日韩欧美不卡在线| 国产精品一区二区免费福利视频 | 亚洲香蕉伊综合在人在线视看| 精品女人久久久| 日韩视频三区| 91免费国产视频| 人成在线免费视频| 樱桃视频在线观看一区| 国产精品天天av精麻传媒| 亚洲成人黄色| 深夜成人在线观看| 亚洲久久在线观看| 国产91色综合久久免费分享| 亚洲高清不卡一区| 麻豆视频在线看| 欧美一级爆毛片| xxxx日本黄色| 国产亚洲成人一区| 99在线看视频| 久草中文在线| 在线亚洲精品福利网址导航| 91人人澡人人爽| 我不卡神马影院| 国产成一区二区| 亚洲人视频在线观看| 亚洲精品国产视频| 日本国产一级片| 欧美精品一二| 欧美孕妇毛茸茸xxxx| 亚洲国产精彩视频| 亚洲欧洲制服丝袜| www.日本一区| 国产伦精品一区二区三区千人斩| 国产69精品久久久久9| 国产成人精品毛片| 中文字幕五月欧美| av在线网址导航| 操欧美老女人| 国产精品久久久av| 国产小视频在线播放| 好吊成人免视频| 国产制服丝袜在线| 亚洲免费播放| 精品国产综合久久| av日韩国产| 亚洲成人黄色在线观看| 欧美黄片一区二区三区| 国产一区二区精品久久91| 国产福利片一区二区| 欧美一区二区三区婷婷| 日韩一区二区欧美| 国产露脸91国语对白| 中文字幕亚洲电影| 麻豆传媒在线看| 欧美精品九九| 国产精品传媒毛片三区| 9999精品成人免费毛片在线看 | 午夜精品一区二区三区国产 | 天天做夜夜做人人爱精品| 91精品国产高清久久久久久久久 | 精品毛片在线观看| 亚洲激情自拍视频| 国产十八熟妇av成人一区| 日韩视频在线一区二区三区| 久久国产精品免费一区| 原纱央莉成人av片| 中文字幕欧美国内| 国产精品久久无码一三区| 亚洲精品欧美专区| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | av成人影院在线| 日韩精品视频在线免费观看| 潘金莲一级淫片aaaaaa播放| 中文字幕乱码一区二区免费| 福利视频999| 亚洲性视频h| 欧美日韩一区二| 欧洲美女精品免费观看视频| 久久91亚洲人成电影网站 | 久久精品97| 久久99国产综合精品女同| 天天干天天插天天操| 在线精品视频一区二区三四| 一级黄色片日本| 国产91高潮流白浆在线麻豆| 久久久久久久激情| 99久久婷婷| 国产亚洲欧美一区二区| 日本综合视频| 欧美激情视频给我| 美国一级片在线免费观看视频| 欧美老肥妇做.爰bbww| 久久久久亚洲天堂| 国产亚洲综合av| 永久看看免费大片| 日日夜夜精品视频天天综合网| 天天在线免费视频| 久久av免费看| 99在线热播| 欧洲亚洲精品久久久久| 2019中文字幕在线观看| 免费观看在线午夜影视| 日韩毛片中文字幕| 超碰在线观看av| 欧美系列一区二区| 国产污污视频在线观看| 亚洲欧美日本韩国| 久久久久久久久久久久| 成人黄色一级视频| 手机免费看av网站| 久久亚洲美女| 国产3p露脸普通话对白| 亚洲精品一区二区妖精| 日本一区不卡| 欧美激情极品| 98国产高清一区| 精品176极品一区| 热久久免费国产视频| free性欧美| 九九热精品在线| www.久久ai| 日韩在线视频二区| 欧美这里只有精品| 特级西西444www大胆免费看| 亚洲欧洲成人自拍| 国产精品密蕾丝袜| 99热国产精品| 美女搡bbb又爽又猛又黄www| 精品一区在线看| 天天爽人人爽夜夜爽| 蜜乳av另类精品一区二区| 无码 制服 丝袜 国产 另类| 一区二区中文| 免费观看中文字幕| 99精品视频在线观看免费播放 | 黄色福利在线观看| 91精品国产综合久久久久| 中文字幕资源网| 欧美综合亚洲图片综合区| 中文字幕国产在线观看| 欧美日韩亚洲一区二| 六月丁香在线视频| 欧美日韩精品在线视频| 日干夜干天天干| 亚洲成人av福利| 日韩伦人妻无码| 午夜在线成人av| 91久久国产视频| 欧美日韩激情网| 中文在线第一页| 欧美色综合网站| 中文字幕乱码无码人妻系列蜜桃| 欧美性猛片aaaaaaa做受| 波多野结衣电车痴汉| 欧美四级电影在线观看| 这里只有久久精品视频| 欧美日韩在线亚洲一区蜜芽| 亚洲一区二区影视| 3751色影院一区二区三区| 国产精品无码一区二区桃花视频| 91精品久久久久久久久99蜜臂| a在线观看免费| 精品国产制服丝袜高跟| 天天av天天翘| 亚洲精品视频久久| 午夜视频成人| 九九热这里只有精品6| 黄色漫画在线免费看| 国产成人av在线播放| 国产黄色精品| 亚洲综合在线小说| 久久精品亚洲成在人线av网址| 久久99久久99精品蜜柚传媒| 国产精品一区2区3区| 在线成人性视频| 在线看片一区| 国产视频一区二区三区在线播放 | 亚洲av网址在线| 久久精品视频免费观看| 欧美日韩色视频| 亚洲成av人影院在线观看网| 人人草在线观看| 在线不卡免费av| 人妻一区二区三区四区| 亚洲性视频网址| 在线不卡日本v二区707| 青草青草久热精品视频在线网站 | 亚洲欧美激情诱惑| 中文字幕亚洲欧洲| 成人av电影在线播放| 日本精品在线观看视频| 玉米视频成人免费看| 亚洲s码欧洲m码国产av| 欧美疯狂做受xxxx富婆| 婷婷av一区二区三区| 最近2019中文字幕大全第二页 | 亚洲一区中文日韩| 无码aⅴ精品一区二区三区| 欧美一区二区三级| 嫩草在线播放| 欧美国产视频一区二区| 久久久人成影片一区二区三区在哪下载| 亚洲综合中文字幕在线观看| 九九精品久久| 国产视频在线观看网站| 久久精品国产**网站演员| 网站免费在线观看| 亚洲男人的天堂网| 欧美特级黄色片| 亚洲激情 国产| 成人区精品一区二区不卡| 国产91色在线播放| 国产精品流白浆在线观看| 中文字幕乱码一区二区三区| 美日韩精品视频| 成年人的黄色片| 亚洲精品菠萝久久久久久久| 91福利免费视频| 亚洲欧美综合v| f2c人成在线观看免费视频| 亚洲www在线| 国产精品久久久久久麻豆一区软件 | 精品国产av色一区二区深夜久久| 中文字幕一区二区三区四区| 最近免费中文字幕大全免费版视频| 精品久久久久久久久久久久久久久| 欧美私人网站| 国产精品视频在线播放| 蜜桃精品wwwmitaows| 午夜免费福利小电影| 成人妖精视频yjsp地址| 久久激情免费视频| 日韩欧美www| 羞羞视频在线观看免费| 成人国产精品免费视频| 久久福利综合| 色播五月综合网| 国产精品福利一区| 中文字幕a级片| 永久免费精品影视网站| 久久91导航| 色涩成人影视在线播放| 久久先锋影音| 无码少妇一区二区| 欧美亚洲日本国产| 99中文字幕一区| 91精品久久久久久| 国产精品黑丝在线播放| 三级黄色片免费看| 亚洲精品免费一二三区| 亚洲AV无码一区二区三区少妇| 色在人av网站天堂精品| 亚洲天堂av资源在线观看| 国产av熟女一区二区三区| 成人av第一页| 久久久久久久久久久影院| 亚洲欧美精品在线| 韩国精品主播一区二区在线观看| 日韩国产在线一区| 免费成人在线影院| 国产精品嫩草影院俄罗斯| 欧美一区二区三区男人的天堂| 欧美黄色视屏| 久久天堂国产精品| 日本中文字幕一区二区有限公司| 在线观看亚洲大片短视频| 欧美卡1卡2卡| 高h视频在线播放| 久久精品国产美女| 蜜桃久久久久久久| 黄色a级片在线观看| 亚洲а∨天堂久久精品9966| 色是在线视频| 在线免费观看成人网| 国产成人在线影院| 成人免费a视频| 日韩一级裸体免费视频| 国产66精品| www黄色在线| 夜夜爽夜夜爽精品视频| 手机亚洲第一页| 国产98色在线| 亚洲电影影音先锋| 一本色道综合久久欧美日韩精品| 欧美性猛片xxxx免费看久爱| 亚洲欧美成人影院| 欧美精品一区在线发布| 九色|91porny| 国产成人精品一区二三区| 中文字幕亚洲字幕| 国内视频在线精品| 邪恶网站在线观看| 午夜视频一区二区| 麻豆影视国产在线观看| 激情视频一区二区| 国产在线视频精品一区| 波多野结衣国产| 久久国产精品99国产精| 亚洲免费观看高清完整版在线观| 日韩欧美理论片| 日本久久一区二区| 91白丝在线|