C 是不是;是“linux”吗;变量有特殊意义吗?
我不明白为什么下面的C 是不是;是“linux”吗;变量有特殊意义吗?,c,variables,C,Variables,我不明白为什么下面的if语句的结果总是不正确: unsigned long is_linux; printf("plz. enter a digit : "); gets(str); sscanf(str,"%d",&is_linux); printf("the value of is_linux = %d \n",is_linux); if(is_linux==1) printf("Here is 1 ! \n"); else printf("There is 0
if
语句的结果总是不正确:
unsigned long is_linux;
printf("plz. enter a digit : ");
gets(str);
sscanf(str,"%d",&is_linux);
printf("the value of is_linux = %d \n",is_linux);
if(is_linux==1)
printf("Here is 1 ! \n");
else
printf("There is 0 ! \n");
即使输入了“1”,我也只能得到“There is 0!”语句。此外,printf()
语句正确显示了is\u linux
(1)的值:
如果我将变量更改为另一个名称,例如,test
,则效果良好。是否有任何理由不使用Is\u linux
variable?我在您的代码中使用了x86_64-redhat-linux上的gcc
编译了上述源代码
sscanf(str,"%d",&is_linux);
原因
is_linux
的类型为无符号长
,它要求转换说明符为lu
将错误(不匹配)类型的参数传递给任何转换说明符都会导致错误。在代码中
sscanf(str,"%d",&is_linux);
原因
is_linux
的类型为无符号长
,它要求转换说明符为lu
将错误(不匹配)类型的参数传递给任何转换说明符都会导致错误。否。您应该能够使用变量名
is_linux
不是保留的,也不是关键字。在最坏的情况下,它可能(但不应该)是一个宏(linux
通常是,很不幸)。先发制人,或者如果由于它是平台上的宏而导致编译错误,您可以#undef
首先将其删除。
(确保其余代码正确。)否。您应该能够使用变量名
is_linux
不是保留的,也不是关键字。在最坏的情况下,它可能(但不应该)是一个宏(linux
通常是,很不幸)。先发制人,或者如果由于它是平台上的宏而导致编译错误,您可以#undef
首先将其删除。
(确保代码的其余部分正确。)您分配给的数据类型与linux不兼容。您将其设置为long,但给它一个int,因此当您使用if语句检查时,您检查的是long值,而不是int。您分配给的数据类型是不兼容的。您将其设置为long,但给它一个int,因此当您使用if语句检查时,您是在检查long值,而不是int。非常感谢您,在这里。 所有的评论都对我找到根本原因很有帮助。 事实上,原因很简单,数据类型。 简单地说,我在sscanf和printf中将%d改为%lu,得到了正确的答案 我的机器是64位的lunux系统,它将无符号长度视为8字节单位。 此外,我还误解了%d可能涵盖所有整数数据类型。 无论如何,我非常感谢你们的评论。谢谢:)非常感谢,谢谢。 所有的评论都对我找到根本原因很有帮助。 事实上,原因很简单,数据类型。 简单地说,我在sscanf和printf中将%d改为%lu,得到了正确的答案 我的机器是64位的lunux系统,它将无符号长度视为8字节单位。 此外,我还误解了%d可能涵盖所有整数数据类型。
无论如何,我非常感谢你们的评论。谢谢:)请显示gets()是非标准的,使用
fgets()
。是全局/静态变量还是自动变量?对于测试,请在定义中添加static
。请注意sscanf(“str、%d”和&is_-linux)
不正确。应使用%lu
或指定了l
长度修饰符的相关转换规范读取无符号长代码>。在64位(非Windows)上机器,很可能您的扫描只设置了8字节整数中的4个字节;其他4个字节可能不为零,因此您的测试失败。为什么不打印is_linux
-小心:printf(“is_linux=%lu\n”,is_linux);
?最好使用strtol
,而不是ANFSCC
。请显示gets()如果是非标准的,请使用fgets()
。对于测试,请在定义中添加static
。请注意sscanf(“str、%d”、&is\u linux)
不正确。应使用%lu
或指定了l
长度修饰符的相关转换规范来读取无符号长
。在64位(非Windows)计算机上,扫描可能只设置8字节整数的4个字节;其他4个字节可能不是零,因此测试失败。为什么不打印is\u linux
-小心地:printf(“is\u linux=%lu\n”,is\u linux)代码>?最好使用strtol
而不是sscanf
。在许多情况下,无符号长
的大小与无符号整数
相同。也许原因不同。@i486这也是一个符号问题,尽管大小相同。问题中的值是1
,符号不起作用。@i486如果使用%lu
,问题会消失吗?我觉得很有趣,一个叫i486的人会说unsigned long
与unsigned int
大小相同。在许多情况下unsigned long
与大小相同大小如无符号int
。也许原因不同。@i486这也是一个符号问题,尽管大小相同。在问题中,值是1
,符号不起作用。@i486如果使用%lu
,问题会消失吗?我觉得有人叫i486说无符号长
与无符号整数
大小相同太有趣了。