Как объединить два массива индекса строки по индексу в C? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть два массива строк с именами name и subject.Я хочу иметь другой массив строк, элементы которого получаются путем объединения строки первого массива со строкой с таким же индексом другого массива.Новый массив должен быть выводом функции.

Здесь я привожу пример кода, но я не могу скомпилировать из-за ошибок.Я также видел этот вопрос , но я не могу его использовать.

Может кто-нибудь подсказать, как решить эту проблему без динамического размещения, а также с динамическим размещением?

#include <stdio.h>
#include <string.h> 
const int MAX = 4;
char* concancate_string(char* name,char* subject);

int main () {

char* name[] = {
  "michel",
  "sam",
  "roy",
  "romi"
};
char* subject[] = {
  "physics",
  "math",
  "chemistry",
  "biology"
};
char* p[];
p=concancate_string(name,subject);
for ( int i = 0; i < MAX; i++) {
      printf("name and subject[%d] = %s\n", i, name[i] );
}

return 0;

}

char* concancate_string(char* name,char* subject)
{
    for ( int i = 0; i < MAX; i++) {
      strcat(name[i]," : ");
      strcat(name[i],subject[i]);
    }
    return name;
}


resulted output array:
{
 "michel : physics",
 "sam : math",
 "roy : chemistry",
 "romi : biology"
} 

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Прежде всего, это объявление не работает:

char* p[]; // how much stack memory should the compiler reserve?
p=concancate_string(name,subject); // can't assign to an array

Вместо этого сделайте это:

char **p = concancate_string(name, subject); // you can assign to pointers, though

Также эта подпись неверна:

char* concancate_string(char* name,char* subject);

Он принимает и возвращает массивы char*, а не один char*, поэтому должно быть:

char **concancate_string(char **name, char **subject);

Кроме того, вы не можете объединить указатель, которому вы присвоили строковый литерал.Они указывают на двоичный файл вашей программы, который доступен только для чтения.Вместо этого функция должна выглядеть следующим образом:

char **concancate_string(char **name, char **subject)
{
    char **pointers = malloc(MAX * sizeof(char*));
    for (int i = 0; i < MAX; i++) {
        pointers[i] = malloc(strlen(name[i]) + strlen(subject[i]) + 4);
        sprintf(pointers[i], "%s : %s", name[i], subject[i]);
    }
    return pointers;
}

Обратите внимание, как мы выделяем массив для указателей, затем выделяем память для каждой отдельной строки, затем используем sprintf для их сборки (вы также можетеиспользуйте, конечно, strcpy и strcat.

Наконец, ваш отпечаток неверный.Вы делаете p, но вместо этого вы печатаете name.Вместо этого должно быть:

printf("name and subject[%d] = %s\n", i, p[i]);

И когда вы закончите, память должна быть освобождена:

for (int i = 0; i < MAX; i++) {
    free(p[i]);
}
free(p);

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

0 голосов
/ 14 февраля 2019

Если вы можете принять максимальную длину каждой строки, тогда нет необходимости использовать динамическое распределение.В приведенном ниже примере (который компилируется и запускается) я предположил, что каждая строка имеет длину 100 (99 используемых символов плюс символ \0).

Поэтому я определил массив, используя вашу константу MAX и 100 как char result[MAX][100] = {0};.{0} инициализирует все элементы 0 (эта инициализация работает только с 0. Затем я передал этот новый массив функции. Обратите внимание, что вы определили параметр функции как char* name, что означает строку: вы хотите передатьмассив строк: я переопределил как concancate_string(char* name[], char* subject[], char out[MAX][100]): обратите внимание на разницу.

Строки просто объединяются с strcat. Есть также другая функция strncat, которая позволяет вам указать максимальное число символов длякопия.

#include <stdio.h>
#include <string.h>
const int MAX = 4;
int concancate_string(char* name[], char* subject[], char out[MAX][100]);

int main () {
  char result[MAX][100] = {0} ;
  char* name[] = {
    "michel",
    "sam",
    "roy",
    "romi"
  };
  char* subject[] = {
    "physics",
    "math",
    "chemistry",
    "biology"
  };
  int p=concancate_string(name, subject, result);
  for ( int i = 0; i < MAX; i++) {
    printf("%s\n", result[i] );
  }

  return 0;

}

int concancate_string(char* name[], char* subject[], char out[MAX][100])
{
  for ( int i = 0; i < MAX; i++) {
    strcat(out[i], name[i]);
    //printf("%s\n", out[i] );
    strcat(out[i], " : ");
    //printf("%s\n", out[i] );
    strcat(out[i], subject[i]);
    //printf("%s\n", out[i] );
  }
  retur
0 голосов
/ 14 февраля 2019

Вот моя попытка с динамическим размещением:

char **concancate_string(const char *name[], const char *subject[], size_t n) {
    char **destin = malloc(n * sizeof *destin);
    for (int i = 0; i < n; i++) {
        destin[i] = malloc(strlen(name[i]) + strlen(subject[i]) + 3 + 1); // add space for " : " and terminating '\0'
        sprintf(destin[i], "%s : %s", name[i], subject[i]);
    }
    return destin;
}

Запомните все free(destin[k]) и free(destin).

См. код, работающий на https://ideone.com/3Qb7v1

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