gpt4 book ai didi

c - gets() 和 scanf 之间的区别 ("%s")

转载 作者:行者123 更新时间:2023-11-30 21:16:49 24 4
gpt4 key购买 nike

我声明了一个字符指针,并用它在运行时扫描字符串;我不知道要输入的字符数,因此我没有使用 callocmalloc 。程序在到达 scanf("%s", NewMsg_au8) 行时结束。我正在使用 CodeBlocks 17.12 编辑器。

我尝试对输入案例之一进行硬编码,例如 NewMsg_au8="0123456789ABCDEF"; - 效果很好。

uint8 * NewMsg_au8;
scanf("%s",NewMsg_au8);//<==
printf("Your entered message is: %s\n",NewMsg_au8);
return NewMsg_au8;

最佳答案

gets(s)scanf("%s", s) 都不安全且可能不正确,因为:

  • 使用如图所示的这些调用,任何一个函数都无法确定要存储到 s 指向的数组中的最大字符数,因此过长的输入将导致缓冲区溢出,从而导致未定义的行为。
  • 在您的情况下,情况更糟,因为 s 是一个未初始化的指针,因此两个函数都会尝试将数据存储到内存中的随机地址中,从而在所有情况下导致未定义的行为。

gets() 无法安全使用,已在 C 标准中弃用,然后从 C 标准中删除。

但是,可以为 scanf() 指定一个介于 %s 之间的数值限制:

#include <stdio.h>
#include <string.h>

char *read_string(void) {
char buf[100];
if (scanf("%99s", buf) == 1) {
printf("Your entered message is: %s\n", buf);
return strdup(buf); /* return an allocated copy of the input string */
} else {
/* no input, probably at end of file */
return NULL;
}
}

请注意,如何仅将 99 个字符存储到数组 buf 中,以允许使用空字节终止符来标记 C 字符串的结尾。 %99s 转换规范允许 scanf() 将最多 100 个字节存储到 buf 中,包括 '\0' 终止符。

关于c - gets() 和 scanf 之间的区别 ("%s"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56285327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com