Хранение строки внутри структуры C - PullRequest
0 голосов
/ 23 сентября 2019

Как домашнее задание по информатике, меня попросили создать алгоритм, который использует этот код внизу.Проблема в том, что строка внутри структуры Name beign хранится как указатель, поэтому, когда я получаю следующий ввод, все строки совпадают, и это нарушает функциональность моего полного кода.

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

#define DEFAULT_CAP 5
#define SUCCESS 1
#define FAILURE 0
#define MAX_LINES 100000

typedef struct Name
{
  char *string;
} Name;

Name *initializeName(char *inputedName)
{
  Name *name = calloc(1, sizeof(Name));
  if (name != NULL)
  {
    name->string = inputedName;
  }
  return name;
}

void printName(Name *name){
  printf("Name -> %s\n", name->string);
}

int main() {

    Name **name;

    for(int i=0; i< 3; i++) {
        char string[100];
        scanf("%s", string);
        name[i] = initializeName(string);
        for(int j = 0; j<=i;j++) {
            printName(name[i]);
        }
    }


    return 0;
}

Этотестовый код с упомянутой нарушенной функциональностьюОн сканирует строку, сохраняет ее в имени и помещает имя в массив имени.

Как мне сохранить имя-> строку в виде строки?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

После того, как вы выделите struct Name, вы можете продолжить и выделить место для хранения копии самой строки:

if (name != NULL)
{
    /* +1 for null terminator at end of string */
    size_t string_length = strlen(inputedName) + 1;

    name->string = calloc(string_length, 1);

Если это удастся, вы можете скопировать строку вВновь выделенное пространство (в случае сбоя необходимо освободить выделенное struct Name):

    if (name->string != NULL)
    {
        memcpy(name->string, inputedName, string_length);
    }
    else
    {
        free(name);
        name = NULL;
    }

У вас также есть ошибка в main().Name **name; - указатель, но он еще никуда не указывает, поэтому вы не можете получить доступ к name[i].Ваш цикл for() имеет доступ только с name[0] до name[2], поэтому изменение определения на массив из трех Name * указателей исправит это:

Name *name[3];
0 голосов
/ 23 сентября 2019
name->string = inputedName;

не копирует строку.Вы хотите strdup

name->string = strdup(imputedName);
...