我有一个给定的代码,在我看来该代码有问题: 我在XINU下编译。
接下来的变量是相关的:
unsigned long ularray[];
int num;
char str[100];
有一个函数返回int:
int func(int i)
{
return ularray[i];
}
现在代码是这样的:
num = func(i);
sprintf(str, "number = %lu\n", num);
printf(str);
问题是我在使用%lu打印时得到大数字,这是不正确的。
如果我将%lu 更改为%d ,我会得到正确的数字。 例如:使用%lu我得到27654342,而%d得到26,后者是正确的;
给出了变量,给出了函数的声明,我写了正文但它必须返回int;
我的问题是:
我不熟悉'sprintf'可能有问题吗?
我将unsigned long分配给int然后用%lu打印int,是吗?
如何解决问题?
提前致谢。
感谢大家的回答。 我只想提一下我在XINU下工作,我改变了文件编译的顺序和你知道的......它在%lu和%d上工作并显示相同的数字。
我很清楚将'unsigned long'分配给int然后使用%lu打印是不正确的编码,可能会导致数据丢失。 但正如我所说,代码是给定的,我无法更改变量和打印命令。
我没有错误或警告顺便说一句。 我不知道为什么更改编译顺序修复了问题,如果有人有想法,那么欢迎你加入。
我要感谢所有试图帮助我的人。
答案 0 :(得分:2)
1)误解一般是格式说明符
2)num是一个int - 因此,当%d
是您要打印的内容时,int
是正确的。
3)理想情况下
int func(int i)
将为unsigned long func(size_t i)
int num
将为unsigned long num
sprintf(str, "number = %d\n", num);
将为sprintf(str, "number = %lu\n", num);
并且要迂腐,printf
应为printf("%s", str);
如果您将警告级别提高,编译器会警告您某些事情。我已经编程很长时间了,我仍然把警告水平高得令人讨厌(根据某些人的标准)。
答案 1 :(得分:2)
我将unsigned long分配给int然后用%lu打印int,是吗?
不,这根本不正确。想一想吧! Printf尝试访问由传入的变量表示的内存,在你的情况下,unsigned long表示在比int更多的位上,因此当printf被告知要打印unsigned int时,它会读取你的实际int并读取一些其他内存可能是垃圾,因此是随机数。如果printf有一个完全提到unsigned long的原型,那么编译器可以执行隐式转换并用零填充剩余的不需要的内存,但由于情况并非如此,你必须执行以下任一解决方案:
一,显式转换你的变量:
printf("%lu", (unsigned long)i);
二,使用正确的格式说明符:
printf("%d", i);
此外,将unsigned long分配给int也存在问题 - 如果long包含太大的数字,那么它将不适合int并被截断。
答案 2 :(得分:0)
如果您有int
,请使用%d
(或%u
表示无符号整数)。如果你有一个长的,请使用%ld
(或%lu
表示无符号长)
如果你告诉printf
你给它一个很长但只传递一个int,你将打印随机垃圾。 (从技术上讲,这将是未定义的行为。)
如果int
以某种方式“来自”很长时间并不重要。一旦你将它分配给更短的东西,额外的字节就会丢失。你只剩下一个int。
答案 3 :(得分:0)
我将unsigned long分配给int然后用%lu打印int,是吗?
不,我建议首先将不转换为int,否则只使用int作为数组类型。存储更大的表示并且使用更小的表示似乎毫无意义。无论哪种方式,在您将变量的类型(技术上是编码)与格式的转换说明符正确配对之前,sprint结果将始终处于关闭状态。这意味着如果您传递无符号长整数,请使用%ul
,如果它是int,请使用%i
或%d
(区别在于%d
总是 base-10,%i
可以使用其他说明符在其他基础上打印。
我该如何解决问题?
将您的func的返回值和num
的编码更改为unsigned long
unsigned long ularray[];
unsigned long num;
char str[100];
unsigned long func(int i)
{
return ularray[i];
}