-1

これが私が書いた関数で、すでにいくつかのデバッグ要素が含まれています。入力として「y」または「Y」のいずれかを入力すると、実行時にセグメンテーション違反が発生します。他の値を入力すると、コードが実行されます。セグメンテーション違反は、スキャンして応答が返ってきた後、「スキャンが機能しました」という行が出力される前に発生します。これらの値に対してのみこのように動作する理由がわかりません。誰かが関数呼び出しを必要とするなら、私もそれを持っています。

query_user(char *response [10])
{
    printf("response after query call before clear=%s\n",response);
    strcpy(response,"");
    printf("response after clearing before scan=%s\n",response);
    printf("Enter another person into the line? y or n\n");
    scanf("%s", response);
    printf("response after scan=%s\n",response);
    printf("scan worked");
}

main()
{
    char response [10]; 
    strcpy(response,"y"); 
    printf("response=%s\n",response); 
    printf("When finished with program type \"done\" to exit\n"); 
    while (strcmp(response,"done") != 0)
    {
        printf("response after while loop and before query call=%s\n",response);
        query_user(&response);
    }
}

エラー時の出力:

clear=yの前のクエリ呼び出し後の応答
スキャン前にクリアした後の応答=
行に別の人を入力しますか?yまたはn
y
scan=y後の応答
セグメンテーション違反(コアダンプ)

エラー以外の出力:

clear=yの前のクエリ呼び出し後の応答
スキャン前にクリアした後の応答=
行に別の人を入力しますか?yまたはn
n
スキャン後の応答=n
スキャンが機能しました
サイクル番号0
(プログラムはこの関数の外で実行され続けます)
4

3 に答える 3

2

のパラメータの宣言query_userが間違っています。へのポインタの配列を宣言しましたchar。単純なcharバッファが必要です。このような:

query_user(char response[])

また

query_user(char* response)

お好みの方を使用してください。

関数を呼び出すと、次のように実行できます。

query_user(response);

mainまた、あなたの宣言が間違っていることを指摘しておきます。あなたは使用する必要があります

int main(void)
于 2012-12-13T10:40:21.987 に答える
0

あなたがしていることは完全に安全ではありません。

ユーザーがタブのサイズを超えてテープを貼るとどうなりますか?(おそらくセグメンテーション違反)。

本当にscanf( " %9s "、response)のようなものを使用する必要があります(その後、バッファを空にする必要があります!):

(タブサイズ= 10の例):

query_user(char *response)
{
    printf("response after query call before clear=%s\n",response);
    strcpy(response,"");
    printf("response after clearing before scan=%s\n",response);
    printf("Enter another person into the line? y or n\n");
    scanf("%9s", response);
    clean_buffer();
    printf("response after scan=%s\n",response);
    printf("scan worked");
}

void clean_buffer()
{
   int c;
   while ((c = getchar ()) != '\n' && c != EOF);
}

それが役に立てば幸い !

于 2012-12-13T11:01:57.010 に答える
0

まず、投稿したコードは問題を再現しません。Gcc 4.6.2 を使用した Linux と Visual Studio 2010 を使用した Windows でテストしました。どちらの場合も、正確なコードを使用した場合、出力は次のようになります。

response=y
プログラムの終了時に「done」と入力して終了します。
response while ループの後、クエリ呼び出しの
前に =y クエリ呼び出しの後、クリア前の応答 =yクリア後の
応答、スキャン =
他の人をラインに入力しますか? y または n
yスキャン
後の応答 =y
スキャンが機能しました 応答 while ループの後、クエリ呼び出しの
前 =y クエリ呼び出し後の応答 クリア前の応答 =yクリア後の
応答 scan=の前に
別の人を入力しますか? y または n

したがって、より適切に診断するには、この問題を示す完全な作業コード セットが必要です。投稿されたコードには多くの警告があり (それらがあなたのベースにもあるかどうかはわかりません)、警告を無視すると悪い場所に陥ることがあります:

  • main返す必要がありintます:int main()
  • メインの最後にリターンを入れるreturn 0;
  • query_uservoid戻り値の型が必要です:void query_user()
  • strcpychar *あなたはそれを与えていますchar **

この最後の点については、次のように配列を関数に渡すことで修正できます。

 query_user(response); // remove the & operator

そして、あなたのヘッダーは次のquery_user()ように変更する必要があります:

 query_user(char response [10]) // remove the * operator

また、 scanf は'\n'文字を onstdinのままにすることに注意してください%s

scanf(" %s", response);

これが大きな違いを生むとは思いませんが、必ず変更を加えてください。実際にエラーを表示するコードの更新を投稿してください。

于 2012-12-13T13:07:18.447 に答える