-1

ユーザーから文字列を取得して配列に格納するプログラムを作成しようとしています。プログラムでは、5 つを超える名前を保存することはできず、名前ごとに 10 文字を超えないようにする必要があります。このプログラムをコンパイルできますが、実行してオプション「1」を選択すると、「Segmentation fault (core dumped)」というエラーが表示されます。プログラムは、オプション「2」の下に名前のリストも表示する必要があります。(ほとんどのコードは、iSelect != 3 の間実行される do-while ループに入れる必要があると思います。)

ここで何が間違っていますか?

コードは次のとおりです。

#include <stdio.h>

main() {
    char cList[20][5];
    char string[10];
    int iNum = 0;
    int iSelect = 0;
    int i = 0;
    int j = 0;
    int k = 0;

    printf("\n\n*** Friend List ***\n\nWhat will you do?\n\n1. Write a friends name in the list.\n2. Print out the names in the list.\n3. Quit\n---> ");
    scanf("%d ", iSelect);

    switch(iSelect) {
    case 1:
        // printf("\n\nWrite name nr %d (max 10 characters): \n", iNum);
        scanf(" %s", &string);
        for(i = 0 ; i < 10 ; i++) {
            cList[i][iNum] = string[i];
        }
        iNum++;
        break;

    case 2:
        for(j = 0 ; j <= iNum ; j++) {
            for(k = 0 ; k < 10 ; k++) {
                printf("%c", cList[k][j]);
            }
        }
        break;
    }

} //End of main()-function
4

4 に答える 4

4
scanf("%d ", iSelect);

する必要があります

scanf("%d ", &iSelect);

この場合、scanf は int ではなく int へのポインタを想定しています。

于 2013-09-17T14:59:03.863 に答える
2

あなたのコンパイラはおそらくここであなたを助けようとしていました:

(nick@gorgeous)-(~/Desktop)
(502)-> gcc test.c 
test.c: In function ‘main’:
test.c:16: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
test.c:16: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘int’
test.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’
test.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’

警告を無視しないでください。問題がある 2 つの行と、それらの何が問題であるかが示されます。

于 2013-09-17T15:02:58.663 に答える
0

あなたの質問にはすでに良い答えがあるので、このプロジェクトまたは他のプロジェクトに2つの小さなアドバイスを追加します:

関数を使用strcpyして、ある char[] を別の char[] にコピーできます。

を使用して、実行時に char[] にメモリを割り当てることもできますmalloc

  char * string = "A sample String";
  char* copy;

  copy = (char*) malloc(sizeof(char) * strlen(string));
  strcpy(copy,string);

  printf("%s", copy);

あなたの場合、scanfasの結果を使用できますstring

于 2013-09-17T15:03:11.257 に答える