gpt4 book ai didi

c - c中的字符串指针交换

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:50 25 4
gpt4 key购买 nike

我环顾四周,但找不到与我相似的案例。我正在尝试交换 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”索引在“排序”函数内进行交换时,它工作得很好,我只是不确定这两个字符串是否真的改变了地址或只是改变了指针:

    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 或其他东西。

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

关于c - c中的字符串指针交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41507217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com