gpt4 book ai didi

c - 如何检查本身是无符号变量的负数(通过用户输入)?

转载 作者:行者123 更新时间:2023-12-04 10:39:05 24 4
gpt4 key购买 nike

我正在尝试针对 unsigned int 的负编号变量进行测试。那不可能吗?它跳过 do while 循环并输出一个垃圾数字。

#include<stdio.h>

unsigned int getPositiveInteger(void);

int main(void){
unsigned int i=getPositiveInteger();
printf("The number is %u.\n", i);
return 0;
}

unsigned int getPositiveInteger(void){
int error=0;
unsigned int n=0;
do{
if(error){
printf("The number must be positive!\n");
}
error=0;
printf("What's the number?\n");
scanf("%u", &n);
if(n<1){
error=1;
}
}
while(n<1);
return n;
}

什么时候跑:

What's the number?

-1

The number is 4294967295.

最佳答案

当输入数字有符号时,scanf%u 生成对 unsigned 类型的数字求反的值,因此它总是产生非负结果。

scanf%u 转换规范在 C 2018 7.21.6.2 12 中:

u Matches an optionally signed decimal integer, whose format is the same as expected for the subject sequence of the strtoul function with the value 10 for the base argument. The corresponding argument shall be a pointer to unsigned integer.

对于 strtoul,7.22.1.4 3 说:

… [For base value 10] the expected form of the subject sequence is a sequence of letters and digits representing an integer with the radix specified by base, optionally preceded by a plus or minus sign,…

和 7.22.1.4 5 说:

… If the subject sequence begins with a minus sign, the value resulting from the conversion is negated (in the return type).

因此,对于输入字符“-1”,scanf 将“1”转换为 unsigned 值 1,然后应用 -运算符(operator)。 unsigned 中的算术换行模 UINT_MAX+1,因此数学负数 −1 换行为 −1+UINT_MAX+1,即 UINT_MAX

要测试输入是否为负数,您可以读取各个字符并检查“-”字符。为此,您可以在临时缓冲区中累积字符,然后使用 sscanf 来处理它们,或者您可以跳过空白字符,直到看到数字或“-”(或其他一些字符,您会将其视为错误)。如果是“-”,则报错。如果是数字,使用ungetc将其放回输入流,然后使用scanf

关于c - 如何检查本身是无符号变量的负数(通过用户输入)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356495/

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