1
#include <stdio.h>
#include <string.h>

struct Directory {
    char Name;
    long int Number;
    int HouseNumber;
    char street;
};

int main(void)
{
    struct Directory contact;
    struct Directory *answer1, *answer2, *answer3, *answer4;
    char answer;

    printf("Welcome to Telephone Directory.\n\nPlease enter the name of the contact.\n");
    scanf("%s", &contact.Name);

    printf("Please enter the number of the contact.\n");
    scanf("%ld", &contact.Number);

    printf("Please enter the address of the contact.\n");
    scanf("%d %s", &contact.HouseNumber, &contact.street);

    answer1 = &contact;
    answer2 = &contact;
    answer3 = &contact;
    answer4 = &contact;

    printf("Would you like to obtain information on your contact? Enter 'yes' or 'no'.\n");
    scanf("%s", &answer);


    if (strcmp(&answer, "yes")==0) {
        printf("%s\n", &answer1->Name);
        printf("%ld\n", answer2->Number);
        printf("%d", answer3->HouseNumber);
        printf("%s", &answer4->street);
    }

    if (strcmp(&answer, "no")==0) {
        printf("Thank you for using Telephone Directory.\n");
    }

}

C で連絡先プログラムを作成しようとしています。プログラムにユーザーの家の住所を出力させたいのです。構造体に「HouseNumber」変数と構造体に「street」変数があり、「answer3」を int 変数として設定して「HouseNumber」を表示し、「answer4」を char 変数として設定して「street」を表示します。一緒に、私は彼らがユーザーの住所を単一の文字列で出力することを望んでいましたが、プログラムを実行し、番地と通りを入力した後に連絡先情報を表示するために「はい」と入力すると、プログラムがクラッシュし、lldb が悪い形式で表示されます。スレッドエラー。私のコンパイラはコードに問題はないと言っているので、すべてが正しいように見えますが、クラッシュします。誰かがこれで私を助けてくれますか?

4

3 に答える 3

2

あなたがするときscanf("%s", &answer);

ユーザーの入力をに書き込んでいますchar answer;。scanf の引数には、文字列全体と 1 つの null バイトを保持するのに十分なスペースが必要です。次のようなものを試してください:

char answer[256];

これは、入力が 256 文字を超えないことを前提としていますが、このような単純なプログラムでは妥当と思われます。%agcc は、 を渡した場合に文字列を割り当てる非標準をサポートしていることに注意してくださいchar*

文字列を保存しようとするときは、そこに置くデータに十分なスペースがあることを確認する必要があります。たとえば、文字のみを保持する Dictionary のように、そうしないと、オーバーフローして、後で必要になる可能性のある他のメモリを踏みにじることになります。

于 2013-07-15T16:55:55.430 に答える
1

私があなたのコードで見た間違いは、name、street、および answer 変数を char として作成しましたが、%sを使用してそれらに文字列を格納しようとした結果、クラッシュしたことです。これらの場所では、char * または文字配列を使用する必要があります。

    char *name //(or) char name[15]

変更されたコードは次のようになります

      #include <stdio.h> 
      struct Directory { 
      char Name[20]; 
      long int Number; 
      int HouseNumber; 
      char street[20]; 
      }; 


    int main(int argc, char *argv[]) 
    { 
        struct Directory contact; 

        struct Directory *answer1, *answer2, *answer3, *answer4; 

        char answer[4]; 

        printf("Welcome to Telephone Directory.\n\nPlease enter the name of the                                          contact.\n"); 

        scanf("%s", contact.Name); 

        printf("Please enter the number of the contact.\n"); 

        scanf("%ld", &contact.Number); 

        printf("Please enter the address and street of the contact.\n"); 

       scanf("%d %s", &contact.HouseNumber, contact.street); 

       answer1 = &contact; 

      answer2 = &contact; 

      answer3 = &contact; 

      answer4 = &contact; 

      printf("Enter yes r no"); 

      scanf("%s",answer); 

      if (strcmp(answer,"yes")==0) { 

        printf("%s\n", answer1->Name); 

        printf("%ld\n", answer2->Number); 

        printf("%d\n", answer3->HouseNumber); 

        printf("%s", answer4->street); 

     } 


    else { 

        printf("Thank you for using Telephone Directory.\n"); 
    } 

   return 0; 
    }
于 2013-07-15T18:12:12.610 に答える