C语言中scanf、gets、fgets的区别

发布于:2024-04-21 ⋅ 阅读:(177) ⋅ 点赞:(0)

scanfgetsfgets都是C语言中用于从标准输入读取数据的函数,但它们之间存在一些重要的差异:

  1. scanf
    • scanf是一个格式化输入函数,它可以根据指定的格式从标准输入读取数据。
    • 使用scanf读取字符串时,需要小心处理缓冲区溢出的问题,因为scanf不会自动检查目标缓冲区的大小。
    • scanf在读取字符串时遇到空格、制表符或换行符会停止。
  2. gets
    • gets函数从标准输入读取一行,直到遇到换行符为止,并将换行符替换为字符串结束符\0
    • gets不检查目标缓冲区的大小,因此非常容易导致缓冲区溢出,引发安全问题。因此,在现代C语言编程中,gets函数已被弃用。
  3. fgets
    • fgets函数也从标准输入读取一行,直到遇到换行符或达到指定的最大字符数。
    • fgets会将换行符一起读入字符串(如果需要可以手动去除),并在字符串末尾添加\0
    • fgets允许指定一个最大字符数,从而可以防止缓冲区溢出,更加安全。

示例代码:

使用scanf:

#include <stdio.h>  
#include <string.h>  
  
#define BUFFER_SIZE 50  
  
int main() {  
    int number;  
    char string_scanf[BUFFER_SIZE];  
  
    // 使用 scanf 读取整数和字符串  
    printf("输入一个数字:\n");  
    scanf("%d", &number);  
    printf("使用scanf输入一个字符串:\n");  
    scanf("%49s", string_scanf); // 限制字符串长度为49,防止溢出  
  
    // 打印读取到的数据  
    printf("scanf输出的数字: %d\n", number);  
    printf("scanf输出的字符串: %s\n", string_scanf);  
  
    return 0;  
}

运行结果:

使用gets(不推荐使用):

#include <stdio.h>  
#include <string.h>  
  
#define BUFFER_SIZE 50  
  
int main() {  
    char string_gets[BUFFER_SIZE];  
  
    // 使用 gets 读取字符串(不推荐使用)  
    printf("使用gets输入一个字符串:\n");  
    gets(string_gets); // 不安全的,可能导致缓冲区溢出  
  
    // 打印读取到的数据  
    printf("gets输出的字符串: %s\n", string_gets);  
  
    return 0;  
}

运行结果:

使用fgets:

#include <stdio.h>  
#include <string.h>  
  
#define BUFFER_SIZE 50  
  
int main() {  
    char string_fgets[BUFFER_SIZE];  
  
    // 使用 fgets 读取字符串  
    printf("使用fgets输入一个字符串:\n");  
    fgets(string_fgets, BUFFER_SIZE, stdin); // 读取最多 BUFFER_SIZE-1 个字符  
  
    // 去除 fgets 读取的字符串末尾的换行符(如果存在)  
    string_fgets[strcspn(string_fgets, "\n")] = 0;  
  
    // 打印读取到的数据  
    printf("fgets输出的字符串: %s\n", string_fgets);  
  
    return 0;  
}

运行结果:


网站公告

今日签到

点亮在社区的每一天
去签到