![](/img/trans.png)
[英]How to reverse an array of strings and reverse each string in place using pointers?
[英]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.