scanf 接收 空格 输入_如何使用scanf输入空格?

"本文讨论了为什么程序员,特别是初学者,应避免使用`scanf("%s")`和未经缓冲区溢出保护的函数,如`gets()`。建议使用`fgets()`来获取用户输入,并通过`sscanf()`进行安全的格式化处理。示例代码展示了如何使用`fgets()`获取用户姓名,然后使用`sscanf()`进行进一步处理,以防止缓冲区溢出。强调了在处理用户输入时的安全性和重要性。"
摘要由CSDN通过智能技术生成

paxdiablo..

171

人们(尤其是初学者)不应该使用scanf("%s")或者没有gets()任何其他没有缓冲区溢出保护的功能,除非您确定输入将始终是特定格式(甚至可能不是那样).

请记住,而不是scanf代表"扫描格式化",并且比用户输入的数据的格式少得多.如果您完全控制输入数据格式但通常不适合用户输入,这是理想的选择.

使用fgets()(具有缓冲区溢出保护)将输入转换为字符串并sscanf()进行评估.由于您只想要用户输入的内容而不进行解析,sscanf()因此无论如何您都不需要:

#include

#include

#include

/* Maximum name size + 1. */

#define MAX_NAME_SZ 256

int main(int argC, char *argV[]) {

/* Allocate memory and check if okay. */

char *name = malloc(MAX_NAME_SZ);

if (name == NULL) {

printf("No memory\n");

return 1;

}

/* Ask user for name. */

printf("What is your name? ");

/* Get the name, with size limit. */

fgets(name, MAX_NAME_SZ, stdin);

/* Remove trailing newline, if there. */

if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))

name[strlen (name) - 1] = '\0';

/* Say hello. */

printf("Hello %s. Nice to meet you.\n", name);

/* Free memory and exit. */

free (name);

return 0;

}

如果您只想从用户那里获得一条线,那就更容易了.它也更安全,因为您可以避免缓冲区溢出.scanf系列非常适用于将字符串转换为不同的东西(例如四个字符和一个int,例如"%c%c%c%c%d")但是,即使这样,你应该使用fgets和sscanf,而不是scanf,以避免缓冲区溢出的可能性. (7认同)

您可以将最大缓冲区大小设置为scanf格式,您只是不能在没有在运行时构建格式的情况下放置运行时计算的(没有相当于*for printf,*是scanf的有效修改器,具有另一种行为:抑制赋值). (4认同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值