为什么在c语言中使用gets函数是危险的 C语言中调用gets()函数进行字符串输入时警告我gets ...
c\u8bed\u8a00\u4e3a\u4ec0\u4e48\u6709\u51fd\u6570\u5371\u9669\u4e00\u8bf4\u554a\uff1f \u6bd4\u5982gets\uff08\uff09\u7684\u6ea2\u51fa\u64cd\u4f5c\u7b49\uff1b\u8fd9\u662f\u5bf9\u7a0b\u5e8f\u4ea7\u751fBUG\uff0c\u51fa\u73b0\u4e0d\u53ef\u9760\u6027\u7684\u4e00\u4e2a\u63cf\u8ff0\uff0c\u6709\u4e9b\u51fd\u6570\u5728\u67d0\u4e9b\u610f\u5916\u60c5\u51b5\u4f1a\u5bfc\u81f4\u7a0b\u5e8f\u9677\u5165\u4e0d\u53ef\u63a7\u72b6\u6001\uff0c\u4ec5\u4ec5\u662fPC\u4e0a\u8fd0\u884c\u6700\u591a\u4e5f\u5c31\u662f\u9000\u51fa\u800c\u5df2\uff0c\u4f46\u662f\u5982\u679c\u662f\u8fd0\u884c\u5728\u98de\u673a\u7b49\u7cfb\u7edf\u91cc\u7684\u8bdd\uff0c\u5c31\u4f1a\u6709\u5927\u9ebb\u70e6\uff0c\u8bf4\u5371\u9669\u4e5f\u4e0d\u4e3a\u8fc7\u3002\u56e0\u4e3a\u82f1\u6587\u6587\u732e\u91cc\u63cf\u8ff0\u4e3adangerous\uff0c\u6240\u4ee5\u4e5f\u5c31\u7ffb\u8bd1\u4e3a\u5371\u9669\u3002
\u51fd\u6570\u6267\u884c\u9700\u8981\u4e00\u4e2a\u6808\u7a7a\u95f4\uff0c\u4f46\u8fd9\u4e2a\u6808\u7a7a\u95f4\u5bb9\u91cf\u662f\u6709\u9650\u7684\uff0c\u800c\u4e14\u6808\u91cc\u5b58\u653e\u4e86\u51fd\u6570\u8fd4\u56de\u7684\u5730\u5740\u3002
gets()\u51fd\u6570\u5728\u83b7\u53d6\u8f93\u5165\u65f6\uff0c\u5982\u679c\u65e0\u9650\u8f93\u5165\u4f1a\u9020\u6210\u6808\u7a7a\u95f4\u6ea2\u51fa\uff0c\u5728\u7a0b\u5e8f\u8fd4\u56de\u65f6\uff0c\u4e0d\u80fd\u6b63\u5e38\u7684\u627e\u5230\u8fd4\u56de\u5730\u5740\uff0c\u7a0b\u5e8f\u5c06\u53d1\u751f\u4e0d\u53ef\u9884\u6d4b\u884c\u4e3a
gets\u4e0d\u68c0\u67e5\u5185\u5b58\u8d8a\u754c\uff0c\u672c\u8d28\u4e0a\u5c31\u662f\u4e0d\u5b89\u5168\u7684\uff0c\u53ef\u4ee5\u6539\u7528\u5fae\u8f6f\u63d0\u4f9b\u7684gets_s\u51fd\u6570\uff0c\u6216\u6362\u7528\u5176\u4ed6\u65b9\u6cd5\u8f93\u5165
谈不上“危险”,gets() 函数从标准输入读入 一行文本,直到读到 新行符 或 EOF 字符 之前,不会停止读入文本。也就是:gets() 不检查边界。因此,当变量空间 小于 一行字符串 时, 使用 gets() 会造成 溢出,程序出错。
例如:
#include<stdio.h>
int main( )
{
char s[5];
printf ("input one line: ");
gets(s);
printf ("%s\n",s);
return 0;
}
这里,char s[5]; 最多存放 5个字符,如果 输入一行字符 太多, 例如 输入了 10 个字符,程序会 出错。出错其实没什么大不了,发现问题,你可以修改 成 char s[15]; 或 输入语句提示
printf ("input one line, less than 5 chars: "); 谈不上“危险”.
绛旓細gets鍑芥暟鍦–璇█涓殑鎰忎箟鏄鍙栧瓧绗︿覆銆備笅闈㈣缁嗚В閲奼ets鍑芥暟鐨勭浉鍏冲唴瀹癸細涓銆佸熀鏈畾涔 gets鍑芥暟鏄疌璇█涓爣鍑嗗簱鍑芥暟涔嬩竴锛岀敤浜庝粠鏍囧噯杈撳叆璇诲彇涓涓瓧绗︿覆锛屽苟瀛樺偍鍦ㄦ彁渚涚殑瀛楃鏁扮粍涓傝鍑芥暟浼氳鍙栧寘鎷┖鏍煎湪鍐呯殑鎵鏈夊瓧绗︼紝鐩村埌閬囧埌鎹㈣绗︽垨杈惧埌鎸囧畾鐨勬暟缁勯暱搴︺備簩銆佸嚱鏁板師鍨 gets鍑芥暟鐨勫師鍨嬫槸锛歝har *gets...
绛旓細gets鍑芥暟鏄疌璇█涓殑涓涓佹棫鐨勮緭鍏ュ嚱鏁銆傚畠鐨勫師鍨嬮氬父鏄痐char *gets`銆傚叾涓紝str鏄竴涓瓧绗︽暟缁勶紝鐢ㄤ簬瀛樺偍浠庤緭鍏ユ祦涓鍙栫殑瀛楃涓层傝繖涓嚱鏁颁細灏嗚鍙栫殑瀛楃閫愪釜瀛樻斁鍦╯tr鎵鎸囧悜鐨勫唴瀛樹綅缃紝鐩村埌閬囧埌鎹㈣绗︽垨杈惧埌缂撳啿鍖哄閲忋傞渶瑕佹敞鎰忕殑鏄紝濡傛灉杈撳叆鐨勬枃鏈暱搴﹁秴杩囦簡鏁扮粍鐨勯暱搴︼紝鍙兘浼氬鑷寸紦鍐插尯婧㈠嚭鐨勯棶...
绛旓細缁撹鏄紝gets()鍑芥暟鍦–璇█涓敤浜庝粠杈撳叆娴佷腑璇诲彇瀛楃涓诧紝浣嗗瓨鍦ㄥ畨鍏ㄩ殣鎮銆傜敱浜庡畠涓嶆鏌ュ瓧绗︿覆闀垮害锛屽彲鑳藉鑷寸紦鍐插尯婧㈠嚭锛屼粠鑰屽紩鍙戠▼搴忓穿婧冦備负閬垮厤杩欑鎯呭喌锛屾帹鑽愪娇鐢ㄦ洿瀹夊叏鐨刦gets()鍑芥暟鏇挎崲锛屽挨鍏舵槸澶勭悊鐢ㄦ埛杈撳叆鏃躲俧gets()浼氬湪閬囧埌鎹㈣绗︽垨鏂囦欢缁撴潫鏃惰嚜鍔ㄥ仠姝紝骞朵笖浼氳冭檻缂撳啿鍖虹殑澶у皬锛岄槻姝㈡孩鍑恒傛敼鍐欏悗...
绛旓細鍦–璇█缂栫▼涓紝鏈変竴涓悕涓cgets鐨鍑芥暟锛岃櫧鐒跺湪VC++6.0鐜涓嬪彲鑳借鏇挎崲涓篲cgets锛屼絾鍏舵牳蹇冨姛鑳戒繚鎸佷竴鑷淬傝繖涓嚱鏁扮殑涓昏浣滅敤鏄府鍔╃▼搴忎粠鐢ㄦ埛鐨勯敭鐩樿幏鍙栦竴涓瓧绗︿覆杈撳叆銆傚畠鐨勫熀鏈敤娉曟槸閫氳繃char绫诲瀷鐨勬寚閽坆uffer鏉ユ帴鏀惰緭鍏ョ殑瀛楃涓层傝鍑芥暟鐨勫疄鐜版槸渚濊禆浜巆onio.h搴擄紝杩欐槸涓涓爣鍑嗙殑C搴擄紝鎻愪緵浜嗚澶氫笌...
绛旓細鍦–璇█涓紝gets鍑芥暟鏄敤浜庝粠鏍囧噯杈撳叆璁惧锛堝閿洏锛夎鍙栧瓧绗︿覆鐨锛屽叾宸ヤ綔鍘熺悊鏄鍙栫洿鍒伴亣鍒版崲琛岀锛屼絾鎹㈣绗︿細琚拷鐣ワ紝鐒跺悗鍦ㄨ鍙栫殑瀛楃涓叉湯灏捐嚜鍔ㄦ坊鍔犱竴涓'\0'瀛楃浠ヨ〃绀哄瓧绗︿覆缁撴潫銆傚叾鍩烘湰璋冪敤褰㈠紡涓猴細gets(s)锛屽叾涓璼鏄瓨鍌ㄥ瓧绗︿覆鐨勫彉閲忥紝鍙互鏄瓧绗︿覆鏁扮粍鍚嶆垨鎸囧悜瀛楃涓茬殑鎸囬拡銆傚鏋滀粎浣跨敤鍗曚釜瀛楃...
绛旓細gets鍑芥暟鍦ㄨ鍙栬緭鍏ユ椂瀛樺湪瀹夊叏椋庨櫓锛屽洜涓哄畠涓嶆鏌ョ紦鍐插尯鐨勫ぇ灏忥紝鍙兘瀵艰嚧缂撳啿鍖烘孩鍑恒傚洜姝わ紝鍦ㄨ澶氱幇浠C璇█缂栬瘧鍣ㄤ腑锛実ets鍑芥暟宸茬粡琚純鐢紝寤鸿浣跨敤fgets鍑芥暟鏇夸唬銆3. 浣跨敤绀轰緥锛氫笅闈㈡槸涓涓畝鍗鐨勪娇鐢╣ets鍑鏁扮殑绀轰緥浠g爜锛歝 include int main { char str[100]; // 瀹氫箟涓涓ぇ灏忎负100鐨勫瓧绗︽暟缁勬潵瀛樺偍...
绛旓細c璇█閲実ets(a) 琛ㄧず杈撳叆涓涓瓧绗︿覆鍒版暟缁刟锛宎琛ㄧず璇诲彇涓涓瓧绗︿覆瀛樺叆a涓,瀛楃涓茶緭鍏ョ粨鏉熸爣蹇椾负鎹㈣绗︺俫ets浠庢爣鍑嗚緭鍏ヨ澶囪瀛楃涓插嚱鏁帮紝鍏跺彲浠ユ棤闄愯鍙栵紝涓嶄細鍒ゆ柇涓婇檺锛屼互鍥炶溅缁撴潫璇诲彇锛屾墍浠ョ▼搴忓憳搴旇纭繚buffer鐨勭┖闂磋冻澶熷ぇ锛屼互渚垮湪鎵ц璇绘搷浣滄椂涓嶅彂鐢熸孩鍑恒
绛旓細鍦–璇█涓锛gets鍑鏁扮敤浜庝粠鏍囧噯杈撳叆锛堥氬父鏄敭鐩橈級璇诲彇涓琛屽瓧绗︿覆锛岀洿鍒伴亣鍒版崲琛岀锛'\n'锛夋垨璇诲彇鍒癊OF锛圗nd Of File锛屾枃浠剁粨鏉熸爣蹇楋級銆俫ets鍑芥暟閫氬父鐢ㄤ簬璇诲彇鐢ㄦ埛杈撳叆鐨勫瓧绗︿覆锛屼絾鍦ㄥ疄闄呭簲鐢ㄤ腑闇瑕佹敞鎰忓畨鍏ㄦч棶棰橈紝鍥犱负璇ュ嚱鏁版棤娉曢檺鍒惰緭鍏ョ殑闀垮害锛屽鏄撳鑷寸紦鍐插尯婧㈠嚭銆傛垜浠浣跨敤printf鍑芥暟杈撳嚭璇诲彇鍒扮殑瀛楃涓...
绛旓細C璇█涓璯ets鍑鏁板凡琚純鐢紝寤鸿浣跨敤fgets鍑芥暟銆傝缁嗚В閲婂涓嬶細1. gets鍑芥暟绠浠 gets鍑芥暟鏄疌璇█涓殑涓涓爣鍑嗚緭鍏ュ嚱鏁帮紝鐢ㄤ簬浠庢爣鍑嗚緭鍏ヨ鍙栦竴琛屾暟鎹紝骞跺瓨鍌ㄥ湪鎸囧畾鐨勫瓧绗︽暟缁勪腑銆傚叾鍑芥暟鍘熷瀷涓猴細char *gets銆傜劧鑰岋紝鐢变簬gets鍑芥暟鍦ㄥ鐞嗚緭鍏ユ椂瀛樺湪缂撳啿鍖烘孩鍑洪闄╋紝鍥犳鍦–璇█涓宸茶寮冪敤銆2. gets鍑芥暟鐨...
绛旓細gets; // 浠庢爣鍑嗚緭鍏ヨ鍙栦竴琛屾暟鎹苟瀛樺偍鍦╯tr鏁扮粍涓 杩欓噷闇瑕佹敞鎰忕殑鏄紝gets鍑鏁板瓨鍦ㄤ竴涓畨鍏ㄩ殣鎮o紝鍥犱负瀹冧笉浼氭鏌ョ洰鏍囨暟缁勬槸鍚︽湁瓒冲鐨勭┖闂存潵瀛樺偍杈撳叆鐨勬暟鎹傚鏋滆緭鍏ョ殑鏁版嵁瓒呰繃浜嗘暟缁勭殑澶у皬锛屽彲鑳戒細瀵艰嚧缂撳啿鍖烘孩鍑虹殑闂銆傚洜姝わ紝鍦ㄧ幇浠鐨凜璇█缂栫▼涓紝鎺ㄨ崘浣跨敤fgets鍑芥暟鏇夸唬gets鍑芥暟銆傚洓銆佸嚱鏁扮ず渚 ...