1

我有一个给定的代码,我认为该代码有问题:我在 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,后者是正确的;

给出了变量,给出了函数的声明,我写了 body 但它必须返回 int;

我的问题是:

  1. 我不熟悉'sprintf'也许问题在那里?

  2. 我将 unsigned long 分配给 int,然后用 %lu 打印 int,对吗?

  3. 我该如何解决这个问题?

提前致谢。

谢谢大家的回答。我只想提一下我在 XINU 下工作,我改变了文件的编译顺序以及你所知道的......它的工作和在 %lu 和 %d 上显示相同的数字。

我很清楚将 'unsigned long' 分配给 int 然后使用 %lu 打印是不正确的编码,可能会导致数据丢失。但正如我所说,给出了代码,我无法更改变量和打印命令。

顺便说一句,我没有错误或警告。我不知道为什么更改编译顺序可以解决问题,如果有人有想法,欢迎分享。

我要感谢所有试图帮助我的人。

4

4 回答 4

2

1)误解是一般的格式说明符

2) num 是一个 int - 因此,%d当 anint是您要打印的内容时是正确的。

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);

如果你把警告级别调高,你的编译器会警告你其中一些事情。我已经编程了很长时间,但我仍然将警告级别高得令人讨厌(按照某些人的标准)。

于 2012-08-25T07:28:52.133 回答
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 并被截断。

于 2012-08-25T07:32:54.923 回答
0

如果您有int,请使用%d(或%u用于 unsigned int)。如果你有一个长的,使用%ld(或%lu无符号长)。
如果你告诉printf它你给它一个 long 但只传递一个 int,你将打印随机垃圾。(从技术上讲,这将是未定义的行为。)

这是否int以某种方式“来自”很长一段时间都没关系。一旦将其分配给较短的内容,多余的字节就会丢失。你只剩下一个 int 了。

于 2012-08-25T07:28:44.370 回答
0

我将 unsigned long 分配给 int,然后用 %lu 打印 int,对吗?

不,我建议不要先转换为 int ,否则只需使用 int 作为数组类型。存储更大的表示并只使用较小的表示似乎没有意义。无论哪种方式,冲刺结果将始终关闭,直到您将变量的类型(技术上是encoding)与格式的转换说明符正确配对。这意味着如果你传递一个 unsigned long ,使用%ul,如果它是一个 int ,使用%ior %d(不同的是它总是%d以 10为基数,可以使用额外的说明符以其他基数打印。%i

我该如何解决这个问题?

更改 func 的返回值和numto的编码unsigned long

unsigned long ularray[];
unsigned long num;
char str[100];

unsigned long func(int i)
{
    return ularray[i];
}
于 2012-08-25T07:39:06.507 回答