簡體   English   中英

如何在C中按索引連接兩個字符串數組索引?

[英]How to concatenate two string array index by index in C?

我有兩個字符串數組,分別稱為namesubject 我想擁有另一個字符串數組,其元素是通過將第一個數組的字符串與另一個數組的索引相同的字符串連接而獲得的。 新數組應該是函數的輸出。

在這里,我給出了一個代碼示例,但是由於出現錯誤而無法編譯。 我也看到了這個問題,但無法使用。

誰能給我一個關於如何在沒有動態分配的情況下也如何通過動態分配解決此問題的提示?

#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"
} 

這是我對動態分配的嘗試:

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上運行的代碼

首先,此聲明不起作用:

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);

我對您的建議是編寫程序的一部分時間,只有在測試了最后一部分並且運行良好后,才從下一部分開始。 如果您只是在沒有測試的情況下編寫整個程序,然后由於到處都是錯誤而無法使用,那么查找它們將變得更加困難。

如果可以假設每個字符串的最大長度,則無需使用動態分配。 在下面的示例中(編譯並運行),我假設每個字符串的長度為100(99個可用字符加\\0字符)。

因此,我使用您的MAX常量和100作為char result[MAX][100] = {0};定義了一個數組char result[MAX][100] = {0}; {0}將所有元素初始化為0(此初始化僅適用於0然后我將此新數組傳遞給函數。請注意,您正在將函數參數定義為char* name ,這意味着一個字符串:您想傳遞數組字符串:我重新定義為concancate_string(char* name[], char* subject[], char out[MAX][100]) :請注意不同之處。

字符串只是簡單地與strcat連接。 還有另一個函數strncat ,它允許您指定要復制的最大char數。

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM