簡體   English   中英

C中的字符串指針交換

[英]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

問題的一部分是僅交換指針,而不交換實際的字符串。

讓我從第一個明顯的錯誤開始,並列出其他錯誤

  1. main()的簽名必須是以下之一

    • int main(void)
    • int main(int argc, char *argv[])
  2. 您正在將一個字符與NULL比較

     for (k = 0; all[i][j][k] != NULL; k++) 

    嘗試打印字符串時,正確的方法是

     for (k = 0; all[i][j][k] != '\\0'; k++) 
  3. sort()函數使用const指針,它將更改數據,因此我無法弄清為什么您認為它必須是const ,它不是必須的,實際上它應該不是。

  4. 您確實需要在需要交換指針的位置修改指針,因此需要一個**指針,將指針保持在像這樣的字符串

     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.

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