Почему мой массив указателей возвращает символ в юникоде? - PullRequest
0 голосов
/ 31 октября 2019

В следующем коде есть массив указателей (char * newName), который доставляет мне некоторые проблемы. Я считаю, что проблема находится где-то между обратными слешами, которые я использовал для создания барьеров ниже. Я приложил картинку ниже. Все выходные данные работают правильно, однако есть три выходных строки прямо под словом «Сантьяго», которые начинаются со странного символа Юникода, и я озадачен тем, почему это происходит. Буквы, которые идут после странного символа (tbuq, bwi и т. Д.), Также являются правильными, поэтому мне просто нужно избавиться от этого символа. Я был бы очень признателен за некоторые указания здесь Picture of the strange characters

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

static int compare(const void* a, const void* b)
{
   return strcmp(*(const char**)a, *(const char**)b);
}

void sort(char* names[], int n)
{
   qsort(names, n, sizeof(char*), compare);
}

int main()
{
   int i, j, k, n;
   char alphabet[26];

   for(i = 0; i < 26; i++)
   {
      alphabet[i] = i + 97;
   }

   char newAlphabet[26];

   printf("input the new alphabet\n");
   for(i = 0; i < 26; i++)
   {
      scanf(" %c", &newAlphabet[i]);
   }

   printf("How many names will you input?");
   scanf(" %d", &n);

   char * names[n];

   printf("Enter the names: \n");   //erase before submitting

   //the user will now enter the names one by one
   for (i = 0; i < n; i++)
   {
      names[i] = (char *) malloc(100 * sizeof(char));  //allocating memory of 100 for each name pointer
      if (names[i] == 0)
      {
         printf("Error.");
         exit(1);
      }

      scanf("%s", names[i]);
   }

   for(i = 0; i < n; i++)
   {
      printf("%s\n", names[i]);
   }

   int nameConvert[n][100];
//convert the strings of names to their corresponding indexes based on the a = 0, b = 1, etc
   for(k = 0; k < n; k++)
   {
      for(i = 0; i < (strlen(names[k])); i++)
      {
         for(j = 0; j < 26; j++)
         {

            if((*(names[k] + i)) == alphabet[j])
            {
               nameConvert[k][i] = j;
               break;
            }
         }
      }
   }
////////////////////////////////////////////////////////////////////////////

   char * newName[n];

   for(i = 0; i < n; i++)
   {
      newName[i] = '\0';
   }

   for (k = 0; k < n; k++)
   {
      newName[k] = (char* ) malloc(100 * sizeof(char));

      for(i = 0; i < (strlen(names[k])); i++)
      {
         char tempstr[2];
         tempstr[0] = newAlphabet[nameConvert[k][i]];
         tempstr[1] = '\0';
         strcat(newName[k], tempstr);
      }
      printf("%s\n", newName[k]);
   }
/////////////////////////////////////////////////////////////////////////////

   for(i=0; i < n; i++)
   {
      for(j = 0; j < strlen(names[i]); j++)
      {
         printf("%d ", nameConvert[i][j]);
      }
      printf("\n");
   }

   sort(newName, n);

   for(i = 0; i < n; i++)
   {
      printf("%s\n", names[i]);
   }



   return 0;
}

1 Ответ

2 голосов
/ 31 октября 2019

Поскольку вы используете strcat(), вы должны убедиться, что память инициализирована нулем (NULL), поскольку речь, конечно, идет о строках. Вы можете сделать это следующим образом:

newName[k] = malloc(100 * sizeof(char));
newName[k][0] = '\0';

Таким образом, вы в основном NULL-завершаете строку в первом символе , что означает, что у вас есть пустая строка. Затем вы добавляете свои фактические данные к этой строке.

Без этого шага у вас была строка C, которая не заканчивалась NULL, то, что нужно стандартной библиотеке строки C, чтобы работать и знать, где строказаканчивается.


Или следуйте предложению @LinusGudmundsson (более дорого, так как он будет выполнять итерацию по 100 элементам для инициализации их всех), и замените этот вызов malloc следующим:

newName[k] = calloc(100 , sizeof(char));

где при вызове этого метода ноль инициализирует память для вас тоже. Подробнее читайте в Разница между malloc и calloc?

Вывод, который вы должны получить сейчас (при любом подходе):

input the new alphabet
b j k v q z c d e t u h w x n o p f g l y m r s i a
How many names will you input?3
Enter the names:
jake amy santiago
jake
amy
santiago
tbuq
bwi
gbxlebcn
9 0 10 4 
0 12 24 
18 0 13 19 8 0 6 14 
jake
amy
santiago

PS: не причина проблемы, но Я разыграю результат malloc? Нет.

...