簡體   English   中英

C:將可變長度的2D數組轉換為1d字符串

[英]C: Convert variable length 2D array into 1d string

考慮類型為char **的2D數組。 該數組具有有限的行數(子字符串數),但列長度可變(子字符串長度可變)。

我想創建一個函數,將這個數組和行數(子字符串)作為參數,並返回一個包含每個有序子字符串(行)的字符串。 它是一個簡單的串聯。 這是該問題的相反行為。

我已經編寫了以下代碼來執行此操作,但是僅當每個子字符串的長度相同(恆定列長度)時,它才有效,因此我將最大列長度作為函數參數傳遞:

char* cat2dCharMat(char** A, int m, int n){

    char* temp = malloc((m*n+1));
    int length = 0;
    for(int i = 0; i < m;++i){
        memcpy(&temp[n*i], A[i],strlen(A[i]));
        length += (int)strlen(A[i]);
    }
    temp[length] = '\0';
    printf("Length of concatenated string is %d chars.\n",strlen(temp));
    return temp;
}

如何使它更通用,以容納許多列長度? 我還編寫了一個main()來伴隨此函數,以獲取一個完整的,最小的,可驗證的示例(原諒2D數組初始化-我發現使用array = {“ hello”,“ world!”}無效):

int main(void){
    char** array2 = (char**)malloc((3)*sizeof(char*));
    for(int i = 0; i < 3; ++i){
        array2[i] = (char*)malloc(4*sizeof(char));
        for(int j = 0; j < 3;++j){
            if(j==0 && i==0)
                array2[i][j] = '0';
            else if(j==1 && i==0)
                array2[i][j] = '8';
            else if(j==2 && i==0)
                array2[i][j] = '7';
            else if(j==0 && i==1)
                array2[i][j] = '4';
            else if(j==1 && i==1)
                array2[i][j] = '9';
            else if(j==2 && i==1)
                array2[i][j] = '5';
        }
    }
    char** array1 = (char**)malloc((3)*sizeof(char*));
    for(int i = 0; i < 3; ++i){
        if(i == 0){
            array1[i] = malloc(4);
            for(int j = 0; j < 3;++j){
                if(j==0 && i==0)
                    array1[i][j] = '0';
                else if(j==1 && i==0)
                    array1[i][j] = '8';
                else if(j==2 && i==0)
                    array1[i][j] = '7';
            }
        }else{
            array1[i] = malloc(5);
            for(int j = 0; j < 4;++j){
                if(j==0 && i==0)
                    array1[i][j] = '0';
                else if(j==1 && i==1)
                    array1[i][j] = '8';
                else if(j==2 && i==1)
                    array1[i][j] = '7';
                else if(j==3 && i==1)
                    array1[i][j] = '7';
            }
        }
    }
    array1[0][3] = '\0';
    array1[1][4] = '\0';
    char* array1cat = cat2dCharMat(array1,2,4);
    char* array2cat = cat2dCharMat(array2,2,3);
    printf("Testing cat2dCharMat()...\n\n");
    printf("Case 1: {\"087\",\"495\"}\n");
    printf("Expected Result: 087495\n");
    printf("Actual Result:   %s\n", array2cat);
    printf("Case 2:{\"087\",\"0877\"}\n");
    printf("Expected Result: 0870877\n");
    printf("Actual Result:   %s\n", array1cat);
    }

我不太了解您希望函數使用的第二個參數(“行數(子字符串)”),因此這是將“數組”的n第一個字符串(不是數組, C:差異)連接在一起的想法在char指針和array之間

請注意, 它根本不是一個安全函數 ,因為它不會檢查您為n賦予的值對於變量來說不是很大(這會引發分段錯誤); 在自己的代碼中實現自己的功能時,請注意這一點。

char * concatenate_these_strings (char ** my_strings ,unsigned int n){
    int i,size = 1;
    for ( i=0 ; i<n ; i++){
            size += strlen (my_strings[i]);
    }
    char * my_result = malloc (size);
    for ( i=0 ; i<n ; i++){
        strcat (my_result,my_strings[i]);
    }
    return my_result;
}

暫無
暫無

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

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