Почему «код» совпадает с «именем»? - PullRequest
0 голосов
/ 20 июня 2019

Имя и код жирафа должны быть изменены пользователем после однократной печати.Я ввожу разные значения для каждого из них, но «код» совпадает с «именем».

Мне кажется, я знаю, как обойти эту ошибку, но я бы хотел знать, как решить эту проблему, не внося слишком много изменений или дополнений в мой код.Я полагаю, что я использую указатели, так как я впервые с ними общаюсь.

Взгляните:

typedef struct {

  int age;
  double height;
  char *name;

}giraffe;

void renameGiraffe(giraffe *g, char *na){

  g->name = na;

}

void recodeGiraffe(char * codes[], int n, char * code){

  codes[n] = code;

}


int main()
{
  giraffe north; giraffe south; giraffe west;
  north.name = "Fred";
  south.name = "Bill";
  west.name = "Kate";

  char in1[] = "";
  giraffe* exhibit[] = {&north, &south, &west};
  char* codes[] = {"GN","GS","GW"};

  for(int i = 0; i < (sizeof(exhibit)/sizeof(exhibit[0])); i++)
  {
    printf("The giraffe named %s has the code %s\n", exhibit[i]->name, codes[i]);
  }

  printf("Let's recode a giraffe. Which giraffe would you like to recode?\n\n");
  scanf("%s", in1);

  if(strcmp("north", in1)== 0)
  {
    printf("what is the new code for north?\n");
    scanf("%s", in1);
    recodeGiraffe(codes, 0, in1);
    printf("North has been recoded. The new code for north is %s\n", in1);
  }

  printf("Let's rename the north giraffe. What's the new name?\n");
  scanf("%s",in1);
  renameGiraffe(&north, in1);

printf("Reprinting the list of giraffes now:\n\n");

for(int i = 0; i < (sizeof(exhibit)/sizeof(exhibit[0])); i++)
  {
    printf("The giraffe named %s has the code %s\n", exhibit[i]->name, codes[i]);
  }

  return 0;
}

Мой вывод:

The giraffe named Fred has the code GN // Ignore the other two giraffes.
The giraffe named Bill has the code GS
The giraffe named Kate has the code GW
Let's recode a giraffe. Which giraffe would you like to recode?

north

What is the new code for north?

NOR

North has been recoded. The new code for north is NOR

Let's rename the north giraffe. What's the new name?

FREDDY

Reprinting the list of giraffes now:

The giraffe named FREDDY has the code FREDDY //The code should be NOR. 
The giraffe named Bill has the code GS
The giraffe named Kate has the code GW

1 Ответ

4 голосов
/ 20 июня 2019

Вы читаете новое имя в in1, а затем присваиваете поле name, которое является указателем, чтобы указать in1. Затем вы читаете код в n1, это то, на что указывает поле name, поэтому name изменилось.

Вместо того, чтобы использовать указатели для name и codes, используйте массивы, достаточно большие, чтобы вместить любую ожидаемую строку, а затем читайте непосредственно в эти строки.

typedef struct {

  int age;
  double height;
  char name[100];

}giraffe;

int main()
{
  giraffe north; giraffe south; giraffe west;
  strcpy(north.name, "Fred");
  strcpy(south.name, "Bill");
  strcpy(west.name, "Kate");

  char in1[100] = "";
  giraffe* exhibit[] = {&north, &south, &west};
  char codes[][100] = {"GN","GS","GW"};

  for(int i = 0; i < (sizeof(exhibit)/sizeof(exhibit[0])); i++)
  {
    printf("The giraffe named %s has the code %s\n", exhibit[i]->name, codes[i]);
  }

  printf("Let's recode a giraffe. Which giraffe would you like to recode?\n\n");
  scanf("%s", in1);

  if(strcmp("north", in1)== 0)
  {
    printf("what is the new code for north?\n");
    scanf("%s", codes[0]);
    printf("North has been recoded. The new code for north is %s\n", codes[0]));
  }

  printf("Let's rename the north giraffe. What's the new name?\n");
  scanf("%s",north.name);

  printf("Reprinting the list of giraffes now:\n\n");

  for(int i = 0; i < (sizeof(exhibit)/sizeof(exhibit[0])); i++)
  {
    printf("The giraffe named %s has the code %s\n", exhibit[i]->name, codes[i]);
  }

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...