2

有人可以告诉我这里出了什么问题吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define ERROR 0
#define MAX_INPUT_LINE 80
#define print(x) {fputs(x,stdout);}
#define SUCCESS 1

int main (long argc, char *argv[])
{
   int mode;
   printf("1 for hexidecimal or 2 for binary");
   scanf("%d", mode);

   printf("\n\n\nThe value of mode is %d\n", mode);
   return 0;
}

当我为二进制输入2时,我得到了这个:

The value of mode is 2665564

显然我应该得到2,我做错了什么?它是我的编译器,是因为我使用的是 Cygwin 吗?为什么模式不是2??

4

9 回答 9

7

你的 scanf 是错误的。应该:

scanf("%d", &mode);

&告诉编译器发送scanf一个指向(即它的地址)的指针,mode而不是mode. 这样scanf可以mode使用新的扫描值进行更新。

于 2013-09-16T07:37:04.680 回答
4

这是C,不是Java。当你使用一个函数时,scanf (...)因为你不能通过引用传递变量,你应该传递一个指向将保存值的变量的指针。

请改用以下内容:

scanf ("%d", &mode);

(&) 的使用将传递地址模式,而不是将模式隐式转换为(int *).

在这个例子中你实际上很幸运,这并没有导致你的程序崩溃。如果 mode 的值为 0 并被强制转换为一个指针以满足此功能,那么您很可能会取消对 NULL 指针的引用。

于 2013-09-16T07:37:35.520 回答
2

你用scanf错了。对于整数值、浮点值或字符等内容,您需要提供指向要填充的变量的指针。使用 address-of 运算符最容易做到这一点&,例如

scanf("%d", &mode);

函数族在scanf读取字符串时也需要一个指针,但由于字符串已经指针(或衰减为指针的数组),因此您不需要字符串的地址运算符。

我建议您阅读scanf参考资料,因为它包含一个表格,显示了不同格式代码所期望的参数。

于 2013-09-16T07:37:46.020 回答
2

的第二个参数scanf是错误的,它需要一个指向an的指针,int因为格式是%d.

scanf("%d", &mode);
//          ^
于 2013-09-16T07:37:56.897 回答
2

scanf正在接受指针,然后尝试将值放入指针指向的位置,这意味着您无法发送mode您需要发送&mode。发送mode将导致未定义的行为。

scanf ("%d", &mode);

你的完整代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define ERROR 0
#define MAX_INPUT_LINE 80
#define print(x) {fputs(x,stdout);}
#define SUCCESS 1

int main (long argc, char *argv[])
{
   int mode;
   printf("1 for hexidecimal or 2 for binary");
   scanf("%d", &mode);

   printf("\n\n\nThe value of mode is %d\n", mode);
   return 0;
}

我还要说明如果您想以十六进制模式打印数字,请使用%x

printf("%x", mode);
于 2013-09-16T07:39:01.400 回答
2

scanf的附加参数是地址。参考这里

顺便说一句,附加参数应指向已分配的对象,其类型由格式字符串中的相应格式说明符指定。

所以只需将第 3 行更改main()为:

scanf("%d", &mode);
于 2013-09-16T07:42:10.220 回答
1

您很幸运,您的程序不会因内存故障而崩溃。由于mode未初始化,其值未定义,因此您将整数存储在随机地址。

稍后,您以十进制打印该地址。

这应该“工作”(如果编译器接受):

printf("%d\n",*mode);

或者

printf("%d\n",*(int*)mode);

为了澄清,我显然不建议取消引用未初始化的指针。我只是想解释为什么程序没有崩溃,并展示如何在保持虚假 scanf 不变的情况下获取输入的值(与正确修复根本原因的所有其他回复不同)。在 32 位环境中,anint和指针都存储在 4 个字节中,因此 CPU 无法区分。当然,编译器至少应该使用这种虚假代码输出警告。

于 2013-09-16T07:39:00.963 回答
1

scanf 原型是 int scanf(const char *format, ...); 因此使用 '&' 发送地址...

于 2013-09-16T07:44:05.417 回答
1

你的代码应该是这样的:

scanf("%d", &mode);

您错过了&代码中的符号。

于 2013-09-16T08:46:58.353 回答