1

ユーザーが友達の情報を入力するとき、割り当てられた適切なスペースへのポインターと、この割り当てられたスペースに友達の情報を格納する必要があります。scanfの引数としてバッファ配列を使用することに言及している他の場所のスニッピッツを読んだことがありますが、これをすべてまとめているだけです。これが私がこれまでに持っているものです。

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


//Structure for contacts
typedef struct friends_contact{

   char *First_Name;
   char *Last_Name;
   char *home;
   char *cell;
 }fr;

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

int main() 
{

  int user_entry=0;
  fr friends[5];
  int buffer[50];
  int counter=0;
  int i=0;
   for(i=0;i<5;i++)
    {
     friends[i].First_Name = (char*) malloc(sizeof(char) * 64); 
     free(friends[i].First_Name);
    }    
  menu(friends, &counter,user_entry,i);
  getch();
  return 0;
}
 //Menu function
 void menu(fr*friends,int* counter,int user_entry, int i) 
{

   do{
      int result;

      printf("\nPhone Book Application\n");
      printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4)" 
      "Showonebook\n5)Exit\n");   
      scanf("%d", &user_entry);

         if(user_entry==1)
            {
            add_contact(friends,counter,i);
            }
            if(user_entry==2)
            {

            } 
            if(user_entry==3)
            {


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

void setFirst(fr*friends, int* counter, int i) 
{
    //malloc issue **
    friends=(fr*) malloc(sizeof(fr));

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



}
char getFirst(fr*friends , int pos) 
{

    printf("%s ", friends[pos].First_Name);
    return *friends[pos].First_Name;
}
void add_contact(fr*friends,int* counter,int i) 
{

    setFirst(friends,counter,i); 
    (*counter)++;
}
void print_contact(fr*friends ,int* counter, int i) 
{

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

これは明らかにコードの一部にすぎず、現在のところ、名前の追加関数に名前を入力した後、セグメンテーション違反が発生します。終了する前に、最後にもう一度メニューにループします。私はどこかで間違っていることに気づきました、そして私はこれを緩衝液で修正しようと思います。解決策はありますか?

4

1 に答える 1

0

変数frは、すでにスペースが割り当てられているスタック上のある場所へのポインターです。それを使用するべきではありません-それはすでに初期化されており、mallocすることはできません(または少なくとも決してそうすべきではありません)。代わりに、ポインタを渡して初期化する必要があります。

つまり、次のようになります。

fr *friends;

そして、スペースを割り当てたいとき

friends = (fr*) malloc(sizeof(fr)* NUMBER OF FR YOU WANT);

さらに、それらを使用する場合は、構造体の要素を初期化する必要があります。これらはすべてポインターであるためです。これは同様に行われます

friends[i].First_Name = (char*) malloc(sizeof(char)* (LENGTH OF STRING + 1));

またはfriends[i]->First_Name、関数にどのように送信したかによって異なります。

あなたにとって良い解決策は、構造体のメンバーを初期化することです。main

int i;
fr friends[5];
for(i=0;i<5;i++)
{
   friends[i].First_Name = (char*) malloc(sizeof(char) * 64);
   friends[i].Last_Name = (char*) malloc(sizeof(char) * 64);
   friends[i].home = (char*) malloc(sizeof(char) * 64);
   friends[i].cell = (char*) malloc(sizeof(char) * 64);
}
//
//Do functions (without malloc'ing)
//
for(i=0;i<5;i++)
{
   free(friends[i].First_Name);
   free(friends[i].Last_Name);
   free(friends[i].home);
   free(friends[i].cell);
}

ここでは、文字列の長さとして64を選択しました。うまくいくと思うものなら何でも設定できます。

肝心なのは、ポインタを使用する前に、ポインタにスペースを割り当てる必要があるということですそうしないと、使用できるメモリを指しておらず、セグメンテーション違反が発生します。また、割り当てたメモリを使い終わったら、忘れずに解放してください。一度解放すると使用できないことを忘れないでください(再度mallocしない限り)。

于 2012-11-09T23:32:54.507 に答える