gpt4 book ai didi

c - *pointer_variable != '\0' 不适用于检查 strtol() 函数中的不成功转换

转载 作者:太空宇宙 更新时间:2023-11-04 07:52:56 25 4
gpt4 key购买 nike

该程序不适用于输入 5r,即当第一个字符为数字且剩余的下一个字符为任何字母或负数时的输入。例如,当我在输出中输入 5r 时,我得到 5 的阶乘。

所以我尝试检查 strtol 不成功的转换:-

if (p == buf || *p != '\0'){ printf("\nInvalid input: not a number\n");}

但是对于所有输入,我得到的输出都是 Invalid input: not a number

我在 Stack Overflow 中发现了很多类似的问题。但是,他们没有解决我的问题。我不明白这个简单的检查有什么问题?如何从 strtol 中成功检测到错误?

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <errno.h>

int display();
void fact_fun(int num_fact);

int main()
{
int num;
while ((num = display()) >= 0)
{
fact_fun(num);
}
return 0;
}

int display()
{
char buf[256];
char *p;
long value;


for (;;)
{
printf("\nEnter number to find factorial or press ENTER KEY to exit: ");

if (fgets(buf, sizeof buf, stdin) == NULL || *buf == '\n')
return -1;

errno = 0;
value = strtol(buf, &p, 0);

if (p == buf || *p != '\0')
{
printf("\nInvalid input: not a number\n");
}
else
{
if (value < 0)
{
printf("\nInvalid input: negative values not allowed\n");
}
else if (errno != 0 || value > INT_MAX)
{
printf("\nInvalid input: value too large for type int\n");
}
else
{
return (int)value;
}
}
}
}

void fact_fun(int num_fact)
{
int fact = 1;
for (int i = 1; i <= num_fact; i++)
{
if (fact > INT_MAX / i)
{
printf("\nInvalid input: arithmetic overflow\n");
return;
}
fact = fact * i;
}
printf("\nFactorial of %d is %d\n", num_fact, fact);
}

最佳答案

您从 fgets 获得的字符串包含 '\n' 作为最后一个字符,因为您按下了回车键,因此将其替换为 '\0'。这是我们 C 编码人员有时会犯的常见错误。

编辑:所以我自己测试过,你是对的,原因是 strtoI 没有弄乱行终止符,所以现在它可以正常使用以下检查:

*p != '\n' 

完整的工作代码是这样的:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <errno.h>

int display();
void fact_fun(int num_fact);

int main()
{
int num;
while ((num = display()) >= 0)
{
fact_fun(num);
}
return 0;
}

int display()
{
char buf[256];
char *p;
long value;
for (;;)
{
printf("\nEnter number to find factorial or press ENTER KEY to exit: ");
if (fgets(buf, sizeof buf, stdin) == NULL || *buf == '\n')
return -1;
errno = 0;
value = strtol(buf, &p, 0);
if (p == buf || *p != '\n')
{
printf("\nInvalid input: not a number\n");
}
else
{
if (value < 0)
{
printf("\nInvalid input: negative values not allowed\n");
}
else if (errno != 0 || value > INT_MAX)
{
printf("\nInvalid input: value too large for type int\n");
}
else
{
return (int)value;
}
}
}
}

void fact_fun(int num_fact)
{
int fact = 1;
for (int i = 1; i <= num_fact; i++)
{
if (fact > INT_MAX / i)
{
printf("\nInvalid input: arithmetic overflow\n");
return;
}
fact = fact * i;
}
printf("\nFactorial of %d is %d\n", num_fact, fact);
}

关于c - *pointer_variable != '\0' 不适用于检查 strtol() 函数中的不成功转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52620091/

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