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

は、 の実際の値ではなく、ポインター(つまり、そのアドレス) を送信する&ようにコンパイラーに指示します。そうすれば、新しくスキャンされた値で更新を行うことができます。scanfmodemodescanfmode

于 2013-09-16T07:37:04.680 に答える
4

これは Java ではなく C です。scanf (...)参照によって変数を渡すことができないため、のような関数を使用する場合、値を保持する変数へのポインターを渡すことが期待されます。

代わりに次を使用します。

scanf ("%d", &mode);

(&) を使用すると、暗黙的に mode を an にキャストする代わりに、address-of モードが渡されます(int *)

この例では、これが原因でプログラムがクラッシュしなかったことは、実際には非常に幸運です。mode の値が 0 で、この関数を満たすためにポインターにキャストされた場合、NULL ポインターを逆参照することになる可能性があります。

于 2013-09-16T07:37:35.520 に答える
2

使い方がscanf間違っています。整数値、浮動小数点値、または文字などについては、入力する変数へのポインタを提供する必要があります。&これは、次のように address-of operator を使用して最も簡単に実行できます。

scanf("%d", &mode);

関数のscanfファミリは、文字列を読み取るときにポインターも必要としますが、文字列既にポインター (またはポインターに減衰する配列) であるため、文字列のアドレス演算子は必要ありません。

このscanfリファレンスを読むことをお勧めします。さまざまな書式設定コードが期待する引数を示す表が含まれているためです。

于 2013-09-16T07:37:46.020 に答える
2

の 2 番目のパラメータscanfが間違っています。形式が であるため、 へのポインタが必要です。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;
}

また、16進モードで数値を印刷する場合は、次を使用します%x

printf("%x", mode);
于 2013-09-16T07:39:01.400 に答える
1

プログラムがメモリ障害でクラッシュしないように幸運です。初期化されていないため、そのmode値は未定義であるため、ランダムなアドレスに整数を格納しています。

後で、そのアドレスを 10 進数で出力します。

これは「機能する」はずです(コンパイラによって受け入れられた場合):

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

また

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

明確にするために、初期化されていないポインターを逆参照することは明らかにお勧めしません。プログラムがクラッシュしなかった理由を説明し、偽の scanf をそのままにして入力値を取得する方法を示したいだけです (根本原因を正しく修正する他のすべての回答とは異なります)。32 ビット環境では、intとポインターは両方とも 4 バイトで格納されるため、CPU では区別できません。もちろん、コンパイラは少なくともそのような偽のコードで警告を出力する必要があります。

于 2013-09-16T07:39:00.963 に答える
1

コードは次のようになります。

scanf("%d", &mode);

&コードにシンボルがありません。

于 2013-09-16T08:46:58.353 に答える