1

ファイルから構造体にデータを読み込まなければならない問題に取り組んでいます。

ファイルは、名前、# で終わる数行の ASCII アート、および評価があるように編成されています。ここに例があります

Sample Name
( S )
( S )
# 5

私は次のように構造体を設定しています:

typedef struct
 {
   char* name;
   char* art;
   int rating;
 }CASE;

私の問題は、segmentation fault以下のコードで名前文字列にメモリを動的に割り当てようとすると、エラーが発生し続けることです。

/*FPin is file pointer to the txt file and all is the array of structs*/
void readFile(FILE* FPin, CASE** all)
{ 
  CASE* walker = *all;
  int count = 0;
  char buffer[160];
  char* bufferPtr = buffer;
  char nameBuffer[100];

  /*Reads in the name*/

  while(fscanf(FPin, "%[^\n]", nameBuffer))
  {
    printf("string is %s\n", nameBuffer);
    walker->name = (char*)malloc(sizeof(char)*(strlen(nameBuffer+1)));  /*ERROR*/  
    strcpy(walker->name, nameBuffer);
  } 

  return;
  }

上記のコードにエラーがあると思われる場所を書き留めました。その行を追加するとエラーが発生し始めたからです。

私は基本的に、テキストから nameBuffer (配列) に名前を読み込んでから、strcpy を使用してこの名前を構造体にコピーしています。これを修正する方法について何かアドバイスはありますか?

ご覧いただきありがとうございます。

ソースの残りの部分を以下に示します。

int main (void)
{
  CASE* all;
  FILE* FPin;

  if((FPin = fopen("art.txt", "r")) == NULL)
  {
    printf("Error opening file.");
    exit(100);  
  }

  allocateStructMem(&all);
  readFile(FPin, &all);

  fclose(FPin);
  return 0;
}

void allocateStructMem (CASE** all)
{
  if((*all = (CASE*)malloc(sizeof(CASE)*1000)) == NULL)
    {
      printf("Fatal memory error!\n");
      exit(1);
   }

  return;
}
4

2 に答える 2

3

strlen(nameBuffer+1)

strlen(nameBuffer)+1

malloc するときは、次のようなことも行う必要がありますall

int allocateStructMem(CASE **all)
{
    /*  +----- Note. And no need to cast as malloc returns (void *)
        |                                           */
    if((*all = malloc(sizeof(CASE*) * 1000)) == NULL)

オーバーフローを防ぐには、 の長さを制限する必要がありますfscanf。つまり:

while (fscanf(FPin, "%99[^\n]", nameBuffer) == 1) {

nameBuffer1に実際に何かを読み込んだことを確認します。

またstrcpy、パッドはありません – しかし、あなたはそれを知っているかもしれません.

于 2012-04-24T01:18:00.130 に答える
2

+1を角かっこ外に移動すると役立ちますか?

walker->name = (char*)malloc(sizeof(char)*(strlen(nameBuffer)+1));  /*ERROR*/ 
于 2012-04-24T01:16:53.503 に答える