gpt4 book ai didi

c - 如何避免使用gcc在c中包装输入数据?

转载 作者:行者123 更新时间:2023-11-30 20:46:55 24 4
gpt4 key购买 nike

#include<stdio.h>
void main()
{
unsigned int a;
printf("Enter a number:");
scanf("%u",&a);
if ( a <= 4294967295) {
printf("Entered no is within limit\n");
}
else {
printf("Entered no is not in the limit");
}
}

哪个输入数字将执行上述条件的 else block ?

尽管输入大于限制,if block 始终会执行。这是因为包裹。有什么办法可以找出包装吗?

这是因为unsigned int的最大限制是4294967295,并且它在二进制中是32位1如果我的输入是 4294967296,它会变成 1,后跟 32 位 0。我们无法访问 1 的第 33 位是否有可能访问第 33 位?

最佳答案

Which input number will execute the else block with the above condition?

您的系统很可能使用 32 位无符号整数,最大值为 4294967295。

如果是这样,则没有可以触发 else block 的输入。

正如许多人所评论的,简单的解决方案是使用具有更多位的变量(如果可能)。但正如 @Brendan 所指出的,它只会给你带来其他问题。

更强大的解决方案是编写自己的函数来解析输入,而不是使用 scanf

这样的函数可能是这样的:

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

// Returns 1 if the string can by converted to unsigned int without overflow
// else return 0
int string2unsigned(const char* s, unsigned int* u)
{
unsigned int t = 0;
if (*s > '9' || *s < '0') return 0; // Check for unexpected char
while(*s)
{
if (*s == '\n') break; // Stop if '\n' is found
if (*s > '9' || *s < '0') return 0; // Check for unexpected char
if (t > UINT_MAX/10) return 0; // Check for overflow
t = 10 * t;
if (t > UINT_MAX - (*s - '0')) return 0; // Check for overflow
t = t + (*s - '0');
s++;
}
*u = t;
return 1;
}

int main(void) {
unsigned int u;
char s[100];
if (!fgets(s, 100, stdin)) // Use fgets to read a line
{
printf("Failed to read input\n");
}
else
{
if (string2unsigned(s, &u))
{
printf("OK %u\n", u);
}
else
{
printf("Illegal %s", s);
}
}
return 0;
}

示例:

input: 4294967295
output: OK 4294967295

input: 4294967296
output: Illegal 4294967296

(感谢 @chux 为我的原始代码提出了更好的替代方案)

关于c - 如何避免使用gcc在c中包装输入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38138733/

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