使用%lu打印int类型 – C + XINU
我有一个给定的代码,在我看来这个代码有问题:我在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,而%di得到26,后者是正确的;
给出变量,给出函数的声明,我写主体但它必须返回int;
我的问题是:
-
我不熟悉’sprintf’可能有问题吗?
-
我将unsigned long分配给int然后用%lu打印int,是吗?
-
我该如何解决这个问题?
提前致谢。
谢谢大家回答。 我只是想提一下我在XINU下工作,我改变了文件编译的顺序和你知道的……它在%lu和%d上工作并显示相同的数字。
我很清楚,将’unsigned long’分配给int然后使用%lu进行打印是不正确的编码,可能会导致数据丢失。 但正如我所说,代码给出,我无法更改变量和打印命令。
我没有错误或警告。 我不知道为什么更改编译顺序修复了问题,如果有人有想法你更欢迎分享。
我要感谢所有试图帮助我的人。
我将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并被截断。
1)误解一般是格式说明符
2)num是一个int – 因此,当你想要打印int
时, %d
是正确的。
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);
如果你将警告级别提高,编译器会警告你这些事情。 我已经编程很长时间了,我仍然把警告水平高得令人讨厌(按某些人的标准)。
如果你有一个int
,使用%d
(或%u
表示unsigned int)。 如果您有一个长,请使用%ld
(或%lu
表示无符号长)。
如果你告诉printf
你给它一个很长但只传递一个int,你将打印随机垃圾。 (从技术上讲,这将是未定义的行为。)
如果那个int
以某种方式“来自”很长时间并不重要。 一旦你将它分配给更短的东西,额外的字节就会丢失。 你只剩下一个int。
我将unsigned long分配给int然后用%lu打印int,是吗?
不,我建议不要先转换为int,否则只使用int作为数组类型。 存储更大的表示并且仅使用更小的表示似乎毫无意义。 无论哪种方式,sprint结果将始终关闭,直到您将变量的类型(技术上的编码 )与格式的转换说明符正确配对。 这意味着如果你传递一个unsigned long,使用%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]; }