C語言gets()與fgets() 函數(shù)的區(qū)別
使用要點:
- 永遠不要使用 gets()
- 總是使用 fgets() 替代 gets()
- 記得處理換行符
- 檢查返回值確保讀取成功
- 考慮輸入緩沖區(qū)清理
1.gets() 函數(shù)
基本用法:
char *gets(char *str);
- 從標準輸入讀取一行字符串
- 遇到換行符或文件結束符停止
- 不檢查數(shù)組邊界,存在安全隱患
示例:
#include <stdio.h>
int main() {
char name[20];
printf("請輸入姓名:");
gets(name); // 危險!可能發(fā)生緩沖區(qū)溢出
printf("你好,%s!\n", name);
return 0;
}
?? gets() 的問題:
- 緩沖區(qū)溢出風險:如果輸入超過數(shù)組大小,會導致內(nèi)存破壞
- C11標準已棄用,C17標準中完全移除
- 現(xiàn)代編譯器會給出警告
2.fgets() 函數(shù)(推薦使用)
基本用法:
char *fgets(char *str, int n, FILE *stream);
str:存儲字符串的緩沖區(qū)n:最大讀取字符數(shù)(包括結尾的\0)stream:輸入流(stdin 表示標準輸入)
示例:
#include <stdio.h>
int main() {
char name[20];
printf("請輸入姓名:");
fgets(name, sizeof(name), stdin); // 安全!
printf("你好,%s!\n", name);
return 0;
}
3. 重要區(qū)別對比
| 特性 | gets() | fgets() |
|---|---|---|
| 安全性 | 不安全,已棄用 | 安全,推薦使用 |
| 邊界檢查 | 無 | 有,指定最大長度 |
| 換行符處理 | 丟棄換行符 | 保留換行符在字符串中 |
| 返回值 | 成功返回str,失敗返回NULL | 成功返回str,失敗返回NULL |
4.fgets() 的換行符問題
fgets() 會保留換行符,需要手動處理:
#include <stdio.h>
#include <string.h>
int main() {
char input[100];
printf("輸入字符串:");
fgets(input, sizeof(input), stdin);
printf("處理前的字符串:%s\n",input);
printf("===========\n");
// 去除換行符
size_t len = strlen(input);
if (len > 0 && input[len-1] == '\n') {
input[len-1] = '\0';
}
printf("處理后的字符串:'%s'\n", input);
return 0;
}
執(zhí)行效果:
輸入字符串:abcd efgh ijklmn
處理前的字符串:abcd efgh ijklmn===========
處理后的字符串:'abcd efgh ijklmn'
(可以看到,處理前的字符串自帶有換行符。)
5. 實際使用示例
5.1 安全輸入示例:
#include <stdio.h>
#include <string.h>
void safe_input() {
char buffer[50];
printf("請輸入文本(最多%d字符):", sizeof(buffer)-1);
if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
// 去除換行符
buffer[strcspn(buffer, "\n")] = '\0';
printf("你輸入的是:%s\n", buffer);
printf("字符串長度:%zu\n", strlen(buffer));
} else {
printf("讀取失??!\n");
}
}
int main() {
safe_input();
return 0;
}
執(zhí)行效果:
請輸入文本(最多49字符):hello,world!
你輸入的是:hello,world!
字符串長度:12
5.2 處理長輸入:
#include <stdio.h>
void clear_input_buffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
int main() {
char line[10];
printf("輸入字符串:");
fgets(line, sizeof(line), stdin);
// 檢查是否讀取了完整行
if (line[strlen(line)-1] != '\n') {
printf("警告:輸入被截斷!\n");
clear_input_buffer(); // 清空輸入緩沖區(qū)
}
printf("結果:%s\n", line);
return 0;
}
輸入字符串:hello, hello, hello, world!!!
警告:輸入被截斷!
結果:hello, he
到此這篇關于C語言gets()與fgets() 函數(shù)的區(qū)別的文章就介紹到這了,更多相關C語言gets()與fgets() 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

