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
问题的另一部分是只交换指针,而不是实际的字符串。
答案 0 :(得分:2)
让我从第一个明显的错误开始,并列出其他人
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
或其他内容。
我并不是说你不应该使用***
指针,但至少它应该是因为你想传递一个**
指针的地址。
答案 1 :(得分:0)
定义为
char ** minString = &all[0][0];
更改测试并记住min
if (strcmp(*minString, all[i][j])>0)
{
*minString = &all[i][j];
}
将交换更改为
swap(&all[0][0], minString);