[英]String pointer swap in c
我環顧四周,但找不到與我相似的案件。 我正在嘗試交換2個字符串指針以對char***
進行排序,因此我試圖從“僅對一個字符串進行排序”開始,以查看我是否正確。
#include <stdio.h>
void printAllStrings(const char *** all)
{
int i;
int j;
int k;
for (i = 0; all[i] != NULL; i++)
{
for (j = 0; all[i][j] != NULL; j++)
{
for (k = 0; all[i][j][k] != NULL; k++)
{
printf("%c", all[i][j][k]);
}
printf(" ");
}
printf("\n");
}
}
void swap(char **a, char **b)
{
char *c = *a;
*a = *b;
*b = c;
}
void sort(const char *** all)
{
int i;
int j;
char * minString = all[0][0];
for (i = 0; all[i] != NULL; i++)
{
for (j = 0; all[i][j] != NULL; j++)
{
if (strcmp(minString, all[i][j])>0)
{
minString = all[i][j];
}
}
}
swap(&all[0][0], &minString);
}
void main()
{
char * arrP1[] = { "father", "mother", NULL };
char * arrP2[] = { "sister", "brother", "grandfather", NULL };
char * arrP3[] = { "grandmother", NULL };
char * arrP4[] = { "uncle","aunt", NULL };
char ** arrPP[] = { arrP1, arrP2, arrP3, arrP4 , NULL };
printAllStrings(arrPP);
sort(arrPP);
printAllStrings(arrPP);
}
第一個“ printAllStrings”正常打印,未排序:
father mother
sister brother grandfather
grandmother
uncle aunt
第二個“ printAllStrings”打印:
aunt mother
sister brother grandfather
grandmother
uncle aunt
因此,它把第一個指針移到了“阿姨”上,但是第二個指針也仍然指向了“阿姨”。 奇怪的是,我調試了一下,實際上看到它們像您期望的那樣交換,但是當我打印時,我發現它們沒有。 我不能在這里出什么毛病。
我期望2個字符串(父親,阿姨)進行交換(實際上不是交換內存中的內容而是交換指針),然后像這樣進行打印:
aunt mother
sister brother grandfather
grandmother
uncle father
我嘗試了兩個答案,他們都給了我這樣的東西:
-gibrish- mother
sister brother grandfather
grandmother
uncle aunt
而且沒有人,我沒有從編譯器收到任何警告/錯誤。 我還是不明白。
當我嘗試通過保存“ minString”索引在“ sort”函數中進行交換時,它可以正常工作,我不確定這2個字符串是否實際上更改了地址或僅更改了指針:
char * tmp = all[0][0];
all[0][0] = minString;
all[indexI][indexJ] = tmp;
Output:
aunt mother
sister brother grandfather
grandmother
uncle father
問題的一部分是僅交換指針,而不交換實際的字符串。
讓我從第一個明顯的錯誤開始,並列出其他錯誤
main()
的簽名必須是以下之一
int main(void)
int main(int argc, char *argv[])
您正在將一個字符與NULL
比較
for (k = 0; all[i][j][k] != NULL; k++)
嘗試打印字符串時,正確的方法是
for (k = 0; all[i][j][k] != '\\0'; k++)
sort()
函數使用const
指針,它將更改數據,因此我無法弄清為什么您認為它必須是const
,它不是必須的,實際上它應該不是。
您確實需要在需要交換指針的位置修改指針,因此需要一個**
指針,將指針保持在像這樣的字符串
char **minString = all[0];
和
minString = &all[i][j];
這樣,您將指針的地址存儲在字符串的地址中,而不是字符串( 或指針的地址)的地址中,但是間接層太多了,因此您可以看到它變得多么令人困惑 。
然后您像這樣交換
swap(&all[0][0], minString);
它可能會做您想要的。
當我嘗試不修改而編譯您的代碼時,警告列表很長,以至於我寫了一條評論說您的代碼中有太多錯誤。 真正的錯誤是您可能忽略了這些警告。
除非在編譯代碼之前您曾期望過警告,否則請不要忽略警告,在這種情況下,這意味着您有意做一些您知道編譯器將針對其發出警告的事情。
如果解決了這些問題,您的代碼可能會完成編寫的目的。
另外,請盡量避免使用***
指針,因為它們會使一切變得困難且容易出錯。 如果必須使用***
指針,則可能需要struct
或其他東西。
我並不是說您絕對不要使用***
指針,但至少應該是因為您想傳遞**
指針的地址。
定義為
char ** minString = &all[0][0];
改變測試並記住分鍾
if (strcmp(*minString, all[i][j])>0)
{
*minString = &all[i][j];
}
將交換更改為
swap(&all[0][0], minString);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.