簡體   English   中英

如何通過C中的function反轉字符串數組中的每一個字符串?

[英]How to reverse every string in an array of strings through a function in C?

我一整天都在嘗試解決這個問題,但我自己無法解決。 搜索 inte.net 也沒有幫助我解決它

所以,這是 function 原型:

void invert(char **arr, int n);

第一個參數是字符串數組,第二個參數是數組中的字符串數。

這是我的代碼:

#include <stdio.h>
#include <string.h>
void invert(char** arr, int n)
{
    int i, j, len;
        for(j=0;j<n;j++)
        {
            len=strlen(arr[j]);
             for(i=0;i<len/2;i++)
                {
                    char tmp = arr[j][i];             
                    arr[j][i] = arr[j][len - i - 1]; 
                    arr[j][len - i - 1] = tmp; 
                }
        }
}
int main()
{
    int n=3, i;
    char **arr;
    arr[0]="John";
    arr[1]="Doe";
    arr[2]="Programmer";
    invert(arr, n);
    for(i=0;i<3;i++)
    {
        printf("%s ",arr[i]);
    }
}

代碼在到達該行時中斷:

arr[j][i] = arr[j][len - i - 1];

我不知道為什么。 function 完美接收了一個字符串數組(針對特定字符串的字符用一些 printf 語句進行了測試), char tmp成功接收到一個正確的字符,但是程序在到達前面提到的那一行時崩潰了。 該行之后的 Printf 語句不起作用。

我錯過了什么嗎? 有人可以解釋我做錯了什么嗎? 謝謝!

對於初學者這個代碼片段

char **arr;
arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

調用未定義的行為,因為指針arr未初始化並且具有不確定的值。

此外,這種方法在任何情況下都是錯誤的,因為您可能不會更改字符串文字。

您需要聲明一個二維數組,例如

enum { N = 11 };

//...

char arr[3][N] =
{
    "John", "Doe", "Programmer"
};

在這種情況下,function 聲明將如下所示

void invert( char arr[][N], int n );

枚舉必須在function聲明之前聲明。

您可以聲明一個指針數組,而不是二維數組

char s1[] = "John";
char s2[] = "Doe";
char s3[] = "Programmer";
char * arr[3] = { s1, s2, s3 };

在這種情況下,function 聲明可能如您的問題所示

void invert(char** arr, int n)

所以你需要做的是用最小的變化來替換這個代碼片段

char **arr;
arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

對於這個代碼片段

char s1[] = "John";
char s2[] = "Doe";
char s3[] = "Programmer";
char * arr[3] = { s1, s2, s3 };

首先,你在這里有什么:

   char **arr;

是指向 char 的指針

其次,即使您有一個指向 char 的指針數組,如下所示:

char *arr[3];

然后分配每個字符串文字

arr[0]="John";
arr[1]="Doe";
arr[2]="Programmer";

仍會調用未定義的行為,因為您正試圖修改只讀字符串文字

您需要的是二維字符數組

char arr[][100] = {"John", "Doe", "Programmer"};

並將 function 簽名更改為:

void invert(char arr[][100], int n)

或者您必須動態分配 memory 並使用 function,例如strcpy(), strdup(), memcpy()等:

char **arr;

arr = malloc(n * sizeof(char *)); // or sizeof(*arr)

if (arr == NULL) {
    fprintf(stderr, "Malloc failed to allocate memory\n");
    exit(1);
}

arr[0] = strdup("John"); // good idea to also check if strdup returned null
arr[1] = strdup("Doe");
arr[2] = strdup("Programmer");

invert(arr, n);
for(i=0;i<3;i++)
{
    printf("%s ",arr[i]);
}

for (i = 0; i < 3; i++) {
    free(arr[i]);
}

free(arr);

暫無
暫無

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

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