1

私は C が初めてで、典型的な初心者向けの電話帳アプリを作成しようとしています。Google で電話帳アプリの例を示すさまざまなリンクを見てきましたが、私が達成しようとしていることを示すものは何もありません。基本的に私がやりたいことは、名、姓、および 2 つの電話番号を持つ構造を作成し、それぞれに対して 2 つの異なる関数を作成することです。構造内の変数ごとに、入力を設定する変数と、入力を読み取る変数があります。これで 8 つの機能が得られますが、さらに 3 つの機能を追加したいと思います。1 つは新しい契約ごとに構造体に 11 を追加する機能、1 つは連絡先を削除する機能、もう 1 つは電話帳を表示する機能です。今は追加機能と閲覧機能に力を入れています。私の問題は、非常に奇妙な出力が得られることです。

#include<stdio.h>
#include<conio.h>

typedef struct friends_contact{
       char First_Name[10];
       char Last_Name[10];
       char home[15];
       char cell[15];

}fr;

void menu(fr*friends ,int* counter,int user_entry, char* nullStr,int i);
void setFirst(fr*,int *,int i);
char getFirst(fr*,int*,char*,int i);
void setLast(fr*friends, int* counter, int i);
char getLast(fr*friends ,int* counter,char *nullStr, int i);
void add_contact(fr*friends,int* counter,int i);
void show_contact(fr*friends ,int* counter,char *nullStr, int i);


int main()
{
  int user_entry=0;
  fr friends[5];
  int counter=0;
  char nullStr[21] = {"\0"}; 
  int i=0;

 menu(friends, &counter,user_entry,nullStr,i);
 getch();
 return 0;
}

void menu(fr*friends,int* counter,int user_entry,char *nullStr,int i)
{
  do{
  printf("Phone Book Application\n");
  printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4) Show phonebook\n5)Exit);   
 scanf("%d", &user_entry);
  if(user_entry==1){

                    add_contact(friends,counter,i);
                    }
   if(user_entry==4){
                  show_contact(friends, counter,nullStr,i);
                   } 
   }while(user_entry!=5);                 
 }

 void setFirst(fr*friends, int* counter, int i)
{
 (*counter)++;
 printf("Enter a first name \n");
 scanf("%s",&friends[*counter-1].First_Name);
}
void setLast(fr*friends, int* counter, int i)
{
 (*counter)++;
 printf("Enter a first name \n");
 scanf("%s",&friends[*counter-1].Last_Name);
}
char getFirst(fr*friends ,int* counter,char *nullStr, int i)
{
     for(i=0; i<*counter; i++)
     {
        if (strcmp(nullStr, friends[i].First_Name) != 0) 
        {
           printf("%s\n", friends[i].First_Name);
        }
     }

return *friends[i].First_Name;
}

char getLast(fr*friends ,int* counter,char *nullStr, int i)
{
     for(i=0; i<*counter; i++)
     {
        if (strcmp(nullStr, friends[i].Last_Name) != 0) 
        {
           printf("%s\n", friends[i].Last_Name);
        }
     }

 return *friends[i].Last_Name;
}
void add_contact(fr*friends,int* counter,int i)
{ 
 setFirst(friends,counter,i); 
 setLast(friends,counter,i);
}    

void show_contact(fr*friends ,int* counter,char *nullStr, int i)
{
 getFirst(friends,counter,nullStr,i);
 getLast(friends,counter,nullStr,i);
}

これが私が今得た出力です:

Enter a first name
john
Enter a first name
smith
Phone Book Application
1) Add friend
2) Delete friend
3) Show a friend
4) Show phone book
5) Exit

4
john
╝ ♠

smith

リストに別の名前を追加すると、結果は同様に奇妙になります。奇妙なことに、姓の関数を作成した後にこれらの問題が発生し始めました。名だけを入力すると、うまくいきました。何か案は?

4

5 に答える 5

0

あなたの問題は次のとおりです。

1) 関数 setFirst でscanf("%s",&friends[*counter-1].First_Name);
2) 関数 setLast で scanf("%s",&friends[*counter-1].Last_Name);

どちらの場合も、文字列変数に scanf を使用する場合、文字列変数は既に文字列の最初の要素へのアドレスであるため、変数の前に「&」を付けるべきではありません。

これはうまくいくはずです:

1) 関数 setFirst でscanf("%s",friends[*counter-1].First_Name);
2) 関数 setLast で scanf("%s",friends[*counter-1].Last_Name);

于 2012-11-02T19:12:25.713 に答える
0

問題は、 と の両方がカウンターをインクリメントしていることにあるようsetFirstですsetLast。したがって、最初のエントリには名が、2 番目のエントリには姓が入力されます。

于 2012-11-02T19:12:44.687 に答える
0

showContacts関数を呼び出すと、最初に関数が呼び出され、getFirst次に関数が呼び出されgetLast、名前を追加するjohn smithjane doe関数getFirstが出力され、john jane関数が出力されるため、出力が悪いためです。 これを解決するには、次のようにする必要があります。getLastsmith doe

void show_contact(fr*friends ,int* カウンター,char *nullStr, int i){

for(i = 0 : *カウンター)

if (strcmp(nullStr, friends[i].First_Name) != 0)

// ここで、関数getFirstgetLastを呼び出す必要があります

}

そして、変更して、関数で見つかった位置から姓/名のみを出力する必要がgetFirstありますgetLastishowContact

于 2012-11-02T20:00:13.457 に答える
0

以下のコードは、すべての問題を解決します。

void show_contact(fr*friends ,int* counter,char *nullStr, int i) {

for( i = 0; i < *カウンター; i++)

  if (strcmp(nullStr, friends[i].First_Name) != 0){
    getFirst(friends, i);
    getLast(friends, i);
  }

}

char getFirst(fr*friends , int pos) {

      printf("%s\n", friends[pos].First_Name);

      return *friends[pos].First_Name;

}

char getLast(fr*friends , int pos) {

      printf("%s\n", friends[pos].Last_Name);

      return *friends[pos].Last_Name;

}

于 2012-11-02T20:29:23.070 に答える
0

OK、いくつか変更を加えて、変数 nullStr を削除したコード全体 (メインを含む) を貼り付けます。名前が balnk かどうかを確認したい場合は、その文字列のサイズを示す strlen(string) を使用できます。サイズが 0 の場合、文字列が空白であることを意味します。

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

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

typedef struct friends_contact{

  char First_Name[10];
   char Last_Name[10];
   char home[15];
   char cell[15];

}fr;

void menu(fr*friends ,int* counter,int user_entry,int i);
void setFirst(fr*,int *,int i);
char getFirst(fr*,int i);
void setLast(fr*friends, int* counter, int i);
char getLast(fr*friends , int i);
void add_contact(fr*friends,int* counter,int i);
void show_contact(fr*friends ,int* counter, int i);

int main() {

int user_entry=0;
fr friends[5];
int counter=0;
int i=0;
menu(friends, &counter,user_entry,i);
return 0;

}

void menu(fr*friends,int* counter,int user_entry, int i) {

行う{

printf("Phone Book Application\n");
printf("1) Add friend\n2) Delete friend\n3) Show a friend\n
               4) Show phonebook\n5)Exit");   

scanf("%d", &user_entry);

if(user_entry==1){
            add_contact(friends,counter,i);
            }
   if(user_entry==4){
          show_contact(friends, counter,i);
           } 
   }while(user_entry!=5);                 

}

void setFirst(fr*friends, int* counter, int i) {

    printf("Enter a first name \n");
    scanf("%s",friends[*counter].First_Name);

}

void setLast(fr*friends, int* counter, int i) {

    printf("Enter a first name \n");
    scanf("%s",friends[*counter].Last_Name);

}

void add_contact(fr*friends,int* counter,int i) {

    setFirst(friends,counter,i); 
    setLast(friends,counter,i);
    (*counter)++;

}

void show_contact(fr*friends ,int* カウンター, int i) {

for( i = 0; i < *counter; i++)
  if (strlen(friends[i].First_Name) && strlen(friends[i].Last_Name) )
    {
            getFirst(friends, i);
            getLast(friends, i);
    }

}

char getFirst(fr*friends , int pos) {

   printf("%s ", friends[pos].First_Name);
   return *friends[pos].First_Name;

}

char getLast(fr*friends , int pos) {

      printf("%s\n", friends[pos].Last_Name);
      return *friends[pos].Last_Name;

}

于 2012-11-02T21:49:23.203 に答える