如何在C中按索引连接两个字符串数组索引?

时间:2019-02-14 09:34:24

标签: c arrays string

我有两个分别为namesubject的字符串数组。我想拥有另一个字符串数组,其元素是通过将第一个数组的字符串与另一个数组的索引相同的字符串连接而获得的。新数组应该是函数的输出。

在这里我给出了代码示例,但是由于出现错误,我无法编译。 我也看到过this question,但无法使用。

有人可以给我一个提示,如何在没有动态分配以及动态分配的情况下解决该问题吗?

#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 :(得分:2)

这是我尝试动态分配的方法:

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)

请参见code running on https://ideone.com/3Qb7v1

答案 1 :(得分:2)

首先,此声明无效:

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进行组装(也可以使用strcpystrcat,当然)。

最后,您的打印错误。您制作了p,但没有打印,而是打印了name。相反,它应该是:

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

完成后,应释放内存:

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

我对您的建议是编写程序的一部分时间,只有在测试了最后一部分并且运行良好后,才从下一部分开始。如果您只是在没有测试的情况下编写整个程序,然后由于到处都是错误而无法使用,那么查找它们将变得更加困难。

答案 2 :(得分:1)

如果可以假定每个字符串的最大长度,则无需使用动态分配。在下面的示例中(编译并运行),我假设每个字符串的长度为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