0

入力データを取得し、構造を使用して印刷しようとしています。このコードを実行すると、姓の入力が取られません。名の入力を直接求めます。誰かがこれで私を助けることができますか?ありがとうございました。

address.c

typedef struct 
{
  char lname[25];
  char fname[20];
  char address[20];
  char phonenumber[20];
}addressbook;

addressbook a;
int main()
{
 printf("enter details:\n");
   printf("enter lastname:\n");
   gets(a.lastname);
   printf("enter firstname:\n");
   gets(a.firstname);
   printf("enter address:\n");
   gets(a.address);
   printf("enter phone number:\n");
   gets(a.phonenumber);
   printf("lastname:%s\n",a.lastname);
   printf("firstname: %s\n", a.firstname);
   printf("address:%s\n", a.address);
   printf("phone number:%s\n", a.phonenumber);
}

これを実行すると、姓の入力を待っていません。直接名を入力します。

4

1 に答える 1

0

そのコードはそのままではコンパイルされず、生成されます (私の環境では):

pax@pax-desktop:~$ gcc -Wall -Wextra -o qq qq.c
qq.c: In function ‘main’:
qq.c:12:2: warning: implicit declaration of function ‘printf’
qq.c:12:2: warning: incompatible implicit declaration of built-in function ‘printf’
qq.c:14:4: warning: implicit declaration of function ‘gets’
qq.c:14:10: error: ‘addressbook’ has no member named ‘lastname’
qq.c:16:10: error: ‘addressbook’ has no member named ‘firstname’
qq.c:21:28: error: ‘addressbook’ has no member named ‘lastname’
qq.c:22:31: error: ‘addressbook’ has no member named ‘firstname’
qq.c:25:1: warning: control reaches end of non-void function

常に (少なくとも最初は) 高い警告レベルでコンパイルし、コンパイラが何を伝えているかに注意する必要があります。

  • stdio.hとを使用する場合は、含める必要がprintfありますgets
  • 構造内で一貫したフィールド名を使用する必要があります。
  • 非 void 関数から何かを返す必要があります (技術的には、標準の新しいバージョンではこれは必要ありませんが、移植性のためにはまだ良い考えです)。

さらに、次のことを検討することもできます。

  • int main()関数の 2 つの正規形の 1 つではありませんmain。標準では実装定義の追加のものを許可していますが、この特定のケースの「正しい」ものはint main (void).
  • getsバッファ オーバーフローを防ぐ方法がないため危険な関数であり、コードが安全ではなくなります。たとえば、自分の名前を 1000 文字入力した場合、スタック上の膨大な量の会計情報 (たとえば、返信先住所など) が上書きされて、プログラムが台無しになる可能性があります。より安全な入力関数はこちらにあります

これらの変更のほとんどを行うと、次のような結果になります。

#include <stdio.h>

typedef struct {
    char lastname[25];
    char firstname[20];
    char address[20];
    char phonenumber[20];
}addressbook;

addressbook a;
int main (void) {
    printf("enter details:\n");

    printf("enter lastname:\n");
    gets(a.lastname);

    printf("enter firstname:\n");
    gets(a.firstname);

    printf("enter address:\n");
    gets(a.address);

    printf("enter phone number:\n");
    gets(a.phonenumber);

    printf("lastname:%s\n",a.lastname);
    printf("firstname: %s\n", a.firstname);
    printf("address:%s\n", a.address);
    printf("phone number:%s\n", a.phonenumber);

    return 0;
}

これは、深刻なバッファ オーバーフローの脆弱性がまだ残っていますが、問題なくコンパイルおよび実行されます。それを修正したい場合は、私が提供したリンクを参照してください。

于 2011-10-04T08:35:00.853 に答える