当指针为NULL时,循环不会退出

3

请有人帮我解决这个问题,以下C代码中的while循环在*next == NULL时似乎无法退出,并尝试使用坏指针调用strlen(*next)在Visual Studio 2010 Express中。我已经尝试了所有我能想到的方法但都无济于事。该代码试图在字符串数组中查找最短和最长的字符串。

char *stringsInArray[] = {"green mats", "cat", "sat", "on", "the", "green mat", NULL};
char *shortest, *longest, **current, **next, **end;

current = stringsInArray;
next = stringsInArray + 1;
shortest = stringsInArray[0];
longest = stringsInArray[0];

while (*next != NULL) 
{
    if (strlen(*current) < strlen(*next))
    {
        if (strlen(shortest) > strlen(*next))
            shortest = *next;
        if (strlen(*current) < strlen(shortest))
       shortest = *current;
        if (strlen(*next) > strlen(longest))
            longest = *next;
    }  
    else
    if (strlen(*current) > strlen(*next))
    {
        if (strlen(*current) > strlen(longest))
      longest = *current;
        if (strlen(*next) < strlen(shortest))
      shortest = *next;
    }
    else // strlen(*stringsInArray) == strlen(*next)
    {
        // do nothing
    }

   *current++;
   *next++;
} 

printf("shortest string: %s\n",*shortest);
printf("longest string: %s\n",*longest);

你为什么不使用for循环? - Dunes
*next的值永远不会达到NULL,但是您却假定它会。请检查您的假设。 - Greg Hewgill
3个回答

4

应该进行更改。

*current++;
*next++;

to

current++;
next++;

两者都可以增加,但前者还会对currentnext进行解引用/返回值,这是不必要的。

然而,你的问题在于:

printf("shortest string: %s\n", *shortest);
printf("longest string: %s\n",  *longest);

在这里,您尝试使用字符串作为格式来打印一个字符。

应该可以这样实现:

printf("shortest string: %s\n", shortest);
printf("longest string: %s\n",  longest);

@PaulR,那不是问题,代码按照预期工作,只是在读取最后一个字符串后没有退出while循环。我尝试了for循环,但遇到了同样的问题。可能是坏指针与干净的空指针不同,Visual Studio无法将*next!= NULL的条件评估为坏指针的真值吗? - Alastair
谢谢大家的帮助。我不知道为什么会有问题。可能与在Visual Studio 2010中以调试模式编译有关。 - Alastair
@Alastair:可能是因为您在修复您不知道的错误时,同时更改了其他内容,更改了逻辑等。我看到您有**end,但它没有被使用。也许这个是失败的一部分。- 无论如何:我在Linux上,无法测试VS。但请注意仔细阅读警告(应出现在VS-gui底部)。还要将警告级别提高到最大。 - Morpfh

0

代码实际运行符合预期 - 您只需要更改

printf("shortest string: %s\n",*shortest);
printf("longest string: %s\n",*longest);

printf("shortest string: %s\n",shortest);
printf("longest string: %s\n",longest);

是的,我尝试了使用 gcc -O0gcc -O3,并得到了不同的结果 - 但可能还有其他问题我没有注意到 - 现在已经删除了我的回答和评论。 - Paul R

-1

%s 期望一个字符指针,即 char *。因此它应该是最短和最长这两个指针,而不是 *shortest 和 *longest 这两个指针位置上的值。


我已经知道指针是如何工作的,但这仍然很难理解。 - Nathan Tuggy
我指的是我们需要使用指针来处理%s格式说明符。shortest或longest不是指针,这导致代码无法正常工作。shortest和longest才是指针。 - Saisujithreddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接