0

はっきりさせておきますが、これは大学の授業です。C++ ライブラリは使用できず、標準の C ライブラリしか使用できません。C++ 文字列や cin/cout を使用するように勧めないでください。この割り当てには役立たないからです。

私の問題: メイン関数にグローバル文字配列があります。関数 foo() の scanf() からグローバル文字配列に文字列を渡す必要があります。すべてが正常にコンパイルされます。問題は、scanf() 関数が、それが指すグローバル文字配列に影響を与えないように見えることです。参考書が示すように、「アドレス」演算子 (&) を使用しています。おそらく、文字配列ポインターと scanf() の「アドレス」(&) との関係を理解し​​ていません。解決策を求めてあらゆる場所を探した気がします。

この問題に数時間を費やしたので、専門家のアドバイスを求めています。

これが私のプログラムの簡略版です。

#include <stdio.h>

void foo(char arr1[], char arr2[]);

int main(void)
{
    char arr1[20] = "initial";
    char arr2[25] = "second";

    foo(arr1); // <------- should change it to the string "second" upon scanf()

    printf("Test Return Value: %s\n",arr1); // <---- returns "initial" (the problem)

    printf("Enter a test value: ");
    scanf("%s", &arr1);

    printf("Test Return Value: %s\n",&arr1);

// ---------------------- this code is not part of the issue
fflush(stdin);
getchar();
return 0;
// ----------------------
}
void foo(char arr1[], char arr2[])
{
    // there will be many returned values

    printf("Enter a test value: ");
    scanf("%s", &arr1); // <---------- the problem function (input < 20 chars)
}
4

3 に答える 3

2
scanf("%s", &arr); // <---------- the problem function (input < 20 chars)

する必要があります

scanf("%s", arr); // <---------- the problem function (input < 20 chars)

C io 関数を使用する危険性!

于 2011-10-20T04:11:55.813 に答える
2

あなたは解決したと言って更新しましたが、考慮したいかもしれないいくつかの観察があります:
1. &呼び出しの&arr1に取り除く(Ayjay & Dennis によって言及されたように、あなたの問題は解決しました) 2. 関数に渡されなかったパラメーターの正しい数(エイドリアン・コーニッシュが述べたように)。したがって、コードはコンパイルされません。 3.未定義の動作です。出力ストリーム専用です。と一緒に使用しないでください。詳細については、この SO の質問を参照してください。 4. これが C++ ソースの場合は、 [常に完全なコンパイラ警告を使用してコードをコンパイルし、すべてを解決する] の代わりに使用してください。これは良い習慣です。:) これが役に立てば幸いです!scanfprintf
foo
fflush(stdin);fflushstdin
#include <cstdio>#include <stdio.h>

于 2011-10-20T06:07:52.917 に答える
0

scanf関数の正しい構文は次のとおりです。

scanf("%s", arr);

&配列/ポインターではなく、単純な変数の演算子のみが必要です。

arr1それに加えて、 、 、の不適切な使用を修正する必要がarr2ありarrます。コードの一部は最初の 2 つの配列を使用し、残りは後者を使用します。

于 2011-10-20T04:13:56.123 に答える