c中的字符串指针交换

时间:2017-01-06 13:52:53

标签: c pointers

我看了看周围,但找不到与我相似的案子。 我试图交换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);

}

第一个&#34; printAllStrings&#34;打印正常,未分类:

father mother
sister brother grandfather
grandmother
uncle aunt

第二个&#34; printAllStrings&#34;打印:

aunt mother
sister brother grandfather
grandmother
uncle aunt

所以它将第一个指针移到&#34;阿姨&#34;但第二个指针仍然指向&#34;阿姨&#34;同样。 奇怪的部分是我调试并实际看到它们像你期望的那样交换,但是当我打印时我看到它们没有。 我不知道这里有什么问题。

我期待2个字符串(父亲,阿姨)交换(实际上并没有在内存中交换交换指针),然后像这样打印:

   aunt mother
   sister brother grandfather
   grandmother
   uncle father

我尝试了两个答案,他们都给了我这样的东西:

      -gibrish- mother
      sister brother grandfather
      grandmother
      uncle aunt

没有人,我没有从编译器中得到任何警告/错误。 我仍然没有得到它。

当我尝试在&#34;中排序&#34;保存&#34; minString&#34;索引工作正常,我只是不确定2个字符串是否实际更改地址或只是指针:

    char * tmp = all[0][0];
    all[0][0] = minString;
    all[indexI][indexJ] = tmp; 

    Output:
     aunt mother
     sister brother grandfather
     grandmother
     uncle father

问题的另一部分是只交换指针,而不是实际的字符串。

2 个答案:

答案 0 :(得分:2)

让我从第一个明显的错误开始,并列出其他人

  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); 
    

    它可能会做你想要的。

  5. 当我尝试编译你的代码而不修改它时,警告列表很长,以至于我写了一条评论说你的代码中有很多错误。真正的错误是您可能忽略了这些警告。

    永远不要忽略警告,除非你在编译代码之前预期它,在这种情况下,这意味着你故意做了一些你知道编译器会发出警告的东西。

    如果您修复了这些问题,您的代码可能会执行您为其编写的代码。

    此外,尽量避免使用***指针,因为它们会使一切变得困难且容易出错。如果您必须使用***指针,那么您可能需要struct或其他内容。

    我并不是说你不应该使用***指针,但至少它应该是因为你想传递一个**指针的地址。

答案 1 :(得分:0)

定义为

char ** minString = &all[0][0];

更改测试并记住min

        if (strcmp(*minString, all[i][j])>0)
        {
            *minString = &all[i][j];
        }

将交换更改为

swap(&all[0][0], minString);