鱼C论坛

 找回密码
 立即注册
查看: 1110|回复: 2

[已解决]scanf和fgets的区别

[复制链接]
发表于 2023-10-22 00:27:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
scanf和fgets的区别
最佳答案
2023-10-22 00:28:51
scanf 和 fgets 都是 C 语言中用于从标准输入读取数据的函数,但两者在实现和使用上有明显区别。

## scanf

1. scanf 以格式字符串为参数,可以按指定的格式从标准输入中读取数据。
2. scanf 可以识别各种不同类型的数据,包括整型、浮点型、字符型等。
3. scanf 函数在读取数据时会自动忽略空格、制表符和换行符等空白字符。这意味着可以单独使用 %d%f%c 等格式符来读取数据,无需考虑输入数据之间的空格。
4. scanf 函数的返回值为成功读取的数据项数。如果数据读取失败,则返回 0 或一个负数代表错误类型。

以下是一个使用 scanf 函数读取整数并输出的示例:
#include <stdio.h>int main() {  int num;  printf("请输入一个整数:");  if (scanf("%d", &num) == 1) {    printf("输入的整数是:%d\n", num);  } else {    printf("输入非法!\n");  }  return 0;}
## fgets

1. fgets 函数以字符数组为参数,可以从标准输入中读取一行字符串。
2. fgets 读取完一行字符串后,会将其中的换行符也一并读入。因此,需要使用 strlen 函数来获取实际读取的字符数,并将换行符替换为字符串结束符号 \0
3. fgets 函数在读取数据时不会自动忽略空白字符。因此,需要手动处理输入数据之间的空格。
4. fgets 函数的返回值为读取的字符串指针。如果读取失败,则返回 NULL。

以下是一个使用 fgets 函数读取字符串并输出的示例:
#include <stdio.h>#include <string.h>int main() {  char str[100];  printf("请输入一行字符串:");  if (fgets(str, 100, stdin) != NULL) {    int len = strlen(str);    if (str[len-1] == '\n') {      str[len-1] = '\0';    }    printf("输入的字符串是:%s\n", str);  } else {    printf("输入非法!\n");  }  return 0;}
希望能够解答你的疑惑,如有需要请随时追问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-22 00:28:27 | 显示全部楼层
scanf和fgets都是C语言中用于输入的函数,但它们有一些区别。

1. 用法不同:
   · scanf的用法是以格式化字符串作为参数,可以用于读取不同类型的数据,如整数、浮点数、字符串等。它会根据格式化字符串的要求来解析输入的数据。
   · fgets的用法是以字符数组和最大读取字符数作为参数,用于读取一行字符串。它会将读取的数据存储到指定的字符数组中。

2. 输入控制:
   · scanf在读取数据时,会自动忽略空格、制表符和换行符等空白字符,并且可以使用格式化字符串来指定输入的格式。
   · fgets会读取输入中的所有字符,包括空格和换行符,将其作为字符串一部分存储到字符数组中。

3. 字符串处理:
   · scanf在读取字符串时,遇到空格或换行符会停止读取,将字符串中的空格作为分隔符。
   · fgets会读取整行字符串,包括空格和换行符,将其作为完整的字符串存储到字符数组中。

4. 安全性:
   · scanf在读取字符串时,存在缓冲区溢出的风险。如果输入的字符串长度超过了scanf指定的缓冲区大小,会导致数据溢出,可能引发程序崩溃或安全漏洞。
   · fgets在读取字符串时,可以指定最大读取字符数,避免了缓冲区溢出的问题。

综上所述,scanf适用于读取不同类型的数据,而fgets适用于读取字符串。在读取字符串时,fgets更安全,可以避免缓冲区溢出的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-22 00:28:51 | 显示全部楼层    本楼为最佳答案   
scanf 和 fgets 都是 C 语言中用于从标准输入读取数据的函数,但两者在实现和使用上有明显区别。

## scanf

1. scanf 以格式字符串为参数,可以按指定的格式从标准输入中读取数据。
2. scanf 可以识别各种不同类型的数据,包括整型、浮点型、字符型等。
3. scanf 函数在读取数据时会自动忽略空格、制表符和换行符等空白字符。这意味着可以单独使用 %d%f%c 等格式符来读取数据,无需考虑输入数据之间的空格。
4. scanf 函数的返回值为成功读取的数据项数。如果数据读取失败,则返回 0 或一个负数代表错误类型。

以下是一个使用 scanf 函数读取整数并输出的示例:
#include <stdio.h>int main() {  int num;  printf("请输入一个整数:");  if (scanf("%d", &num) == 1) {    printf("输入的整数是:%d\n", num);  } else {    printf("输入非法!\n");  }  return 0;}
## fgets

1. fgets 函数以字符数组为参数,可以从标准输入中读取一行字符串。
2. fgets 读取完一行字符串后,会将其中的换行符也一并读入。因此,需要使用 strlen 函数来获取实际读取的字符数,并将换行符替换为字符串结束符号 \0
3. fgets 函数在读取数据时不会自动忽略空白字符。因此,需要手动处理输入数据之间的空格。
4. fgets 函数的返回值为读取的字符串指针。如果读取失败,则返回 NULL。

以下是一个使用 fgets 函数读取字符串并输出的示例:
#include <stdio.h>#include <string.h>int main() {  char str[100];  printf("请输入一行字符串:");  if (fgets(str, 100, stdin) != NULL) {    int len = strlen(str);    if (str[len-1] == '\n') {      str[len-1] = '\0';    }    printf("输入的字符串是:%s\n", str);  } else {    printf("输入非法!\n");  }  return 0;}
希望能够解答你的疑惑,如有需要请随时追问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 19:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表