gpt4 book ai didi

C - scanf() vs gets() vs fgets()

转载 作者:太空狗 更新时间:2023-10-29 16:21:05 26 4
gpt4 key购买 nike

我一直在做一个相当简单的程序,将一串字符(假设输入数字)转换为一个整数。

完成后,我注意到一些我无法回答的非常奇特的“错误”,主要是因为我对scanf()gets()fgets() 函数起作用。 (虽然我确实阅读了很多文献。)

所以不用写太多文字,下面是程序代码:

#include <stdio.h>

#define MAX 100

int CharToInt(const char *);

int main()
{
char str[MAX];

printf(" Enter some numbers (no spaces): ");
gets(str);
// fgets(str, sizeof(str), stdin);
// scanf("%s", str);

printf(" Entered number is: %d\n", CharToInt(str));

return 0;
}

int CharToInt(const char *s)
{
int i, result, temp;

result = 0;
i = 0;

while(*(s+i) != '\0')
{
temp = *(s+i) & 15;
result = (temp + result) * 10;
i++;
}

return result / 10;
}

这就是我一直遇到的问题。首先,当使用 gets() 函数时,程序运行完美。

其次,当使用 fgets() 时,结果略有错误,因为显然 fgets() 函数最后读取换行符(ASCII 值 10),这搞砸了结果.

第三,当使用 scanf() 函数时,结果是完全错误的,因为第一个字符显然有一个 -52 ASCII 值。对此,我无从解释。

现在我知道 gets() 不鼓励使用,所以我想知道我是否可以在这里使用 fgets() 这样它就不会读取 (或忽略)换行符。另外,这个程序中的scanf()函数是怎么回事?

最佳答案

  • 从不使用gets。它不提供针对缓冲区溢出漏洞的保护(也就是说,您无法告诉它您传递给它的缓冲区有多大,因此它无法阻止用户输入大于缓冲区和破坏内存的行)。

  • 避免使用scanf。如果使用不当,它可能会出现与 gets 相同的缓冲区溢出问题。即使忽略这一点,it has other problems that make it hard to use correctly .

  • 通常你应该使用 fgets 代替,虽然它有时不方便(你必须去除换行符,你必须提前确定缓冲区大小,然后你必须弄清楚要做什么处理太长的行——你是否保留你阅读的部分和 discard the excess ,丢弃整个内容,动态增加缓冲区并重试,等等)。有一些非标准函数可以为您执行此动态分配(例如 POSIX 系统上的 getlineChuck Falconer's public domain ggets 函数)。请注意,ggets 具有类似 gets 的语义,因为它会为您去除尾随的换行符。

关于C - scanf() vs gets() vs fgets(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302255/

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