1

scanf()別の関数を使用して、 (の外)を使用してデータを入力しようとしていますmain。この新しい関数は、行を印刷してからユーザーからの入力を受け取ることになっています。ただしscanf、関数内とテストしているprintf()関数内で問題が発生しているようです。main

関数からポインターを受け取っていると思いますが、特定のコンパイラーの警告により、ポインターに関する私の仮定が正しいかどうか疑問に思っています。

私はこのコードの出力に混乱しています:

#include <stdio.h>
void set_Info(void);

int main()
{
int scanNum = 0;
set_Info();

printf("%d", &scanNum);
return 0;
}

void set_Info(void)          /* start of function definition */

{
int scanNum;

printf("Scan test, enter a number");
scanf("%d",&scanNum);
}

数値、たとえば2を指定すると、main()のprintfステートメントの結果は次のようになります。

2665560

さて、私が出力がメモリアドレスのように見えることを私が知ることができる限り、それを修正するために私が試みたのは、次のようにメインのポインタを逆参照することです:

int scanNum = 0;
int scanNumHolder;

set_Info();

scanNumHolder = *scanNum;
printf("%d", &scanNumHolder);

このコードは、scanNum変数を逆参照された値のに割り当てられるようにするものだと思いますscanNum。ただし、これを行うと、上記と同じ出力が得られます。それは私に2つのことのうちの1つを信じさせる。私が正しく逆参照scanNumしていないかscanNum、この状況では実際にはまったくポインタではありません。

コンパイラから受け取る最も一般的なエラーは次のとおりです。

error: invalid type argument of unary ‘*’ (have ‘int’)

int値をポインタとして処理しようとしているのであれば、これは理にかなっていると思います。

正しく逆参照されていない場合scanNum、どうすればこれを達成できますか?

お手伝いありがとう

*アップデート

助けてくれてありがとう。

要約すると

set_info関数にアドレスパラメータを渡す必要があります。アドレスパラメータを使用する必要がある理由は、関数呼び出しの終了後に関数のローカルメモリが消去されるためです。したがって、main関数で宣言された変数を機能させるために、関数が終了したときに変更が失われないように、問題の変数のアドレスを渡します。

main関数内で、引数として&scanNumを指定してset_infoを呼び出すと、変数の参照tpが渡されるため、関数内のscanfステートメントによって生成された値を割り当てることができます。

SOのすばらしい人々によって正しく指摘されたように、私が間違っていたことは、値を返すようにset_infoを呼び出そうとしているが、実際には実際に必要なように変数を変更していることです。

助けてくれてありがとう!

4

3 に答える 3

3

この関数:

void set_Info(void)
{
    int scanNum;
    scanf("%d", &scanNum);
}

標準入力から整数を読み取り、それをscanNum変数に格納します。変数は、この関数のスコープ内にのみ存在する自動保存期間を持つローカル変数です。

そしてあなたの体main

int scanNum = 0;
set_Info();

printf("%d", &scanNum);

と呼ばれるローカル変数を定義し、次に定義に影響を与えない関数をscanNum呼び出してから、変数のアドレスを出力します。set_Info()scanNummainscanNum


これはあなたがやろうとしていることです:

void set_Info(int* num)
{
    // read an integer and store it into int that num points to:
    scanf("%d", num);
}

int main()
{
    int scanNum = 0;
    // pass the address of scanNum to set_Info function so that
    // changes to scanNum are visible in the body of main as well:
    set_Info(&scanNum);
    printf("%d", scanNum);
    return 0;
}

また、プログラミングを続ける前に、Cの基本に関する本を読むことにもっと時間をかけることをお勧めします:)

于 2013-02-28T18:16:57.823 に答える
2

変数をset_Info関数に渡して、データの保存場所がわかるようにします。これにより、複数の値をスキャンできるようになり、ポインターを単純にインクリメントできます。関数はポインタを必要とするため、必ず&variableNameを使用して変数アドレスをset_Info()に渡してください。

#include <stdio.h>
void set_Info(int *pScanNum);

int main()
{
    int scanNum = 0;
    set_Info(&scanNum);

    printf("%d", scanNum);
    return 0;
}


//Pass in the pointer to scanNum
void set_Info(int *pScanNum)
{
    printf("Scan test, enter a number");
    scanf("%d",pScanNum);
}
于 2013-02-28T18:25:22.410 に答える
1

アンパサンドを取り除きます!Printfは、ポインターではなく整数を必要とします。

printf("%d", scanNum);

そして、lihoが言ったように、関数の外で取得できるように、set_infoからscanNumを返す必要があります。

int scanNum = set_Info();
于 2013-02-28T18:16:55.347 に答える