这两段代码有什么区别?运行结果为什么不一样?谢谢!

第一段代码:

#include <stdio.h>
#include <stdbool.h>
bool findvalue(char ** strings,char ch);
int main()
{
    char * str[3] = {"Ilovesh","Doyoulovesh","Iloveshtoo"};
    char ** strings;
    strings = str;
    char ch = 't';
    printf("%p\n",strings);
    printf("%s\n",*strings);
    findvalue(strings,ch);
    printf("%p\n",strings);
    printf("%s\n",*strings);
}

bool findvalue(char ** strings,char ch)
{
    while (*strings++ != NULL)
    {
        while (**strings != '\0')
        {
            if (*(*strings)++ == ch)
            return true;
        }
    }
    return false;
}

运行结果:

000000000065FDF0
Ilovesh
000000000065FDF0
Ilovesh

第二段代码:

#include <stdio.h>
#include <stdbool.h>
bool findvalue(char ** strings,char ch);
int main()
{
    char * str[3] = {"Ilovesh","Doyoulovesh","Iloveshtoo"};
    char ** strings;
    strings = str;
    char ch = 't';
    printf("%p\n",strings);
    printf("%s\n",*strings);
    findvalue(strings,ch);
    printf("%p\n",strings);
    printf("%s\n",*strings);
}

bool findvalue(char ** strings,char ch)
{
    while (*strings != NULL)
    {
        while (**strings != '\0')
        {
            if (*(*strings)++ == ch)
            return true;
        }
        strings++;
    }
    return false;
}

运行结果:

000000000065FDF0
Ilovesh
000000000065FDF0

两段代码唯一的区别:
第一段代码中 用的*strings++ != NULL;在函数中好像没有改变strings
第二段代码中,用的*strings != NULL;strings++;在函数中改变strings了。

这两个有区别吗?感谢感谢!

阅读 1.3k
2 个回答

首先通过 *strings != NULL 判定结束就有问题,就算超过数组长度也不一定是 NULL,除非数组末尾加一个 NULL 或把数组长度改为 4(不足默认补 0NULL

char * str[] = {"Ilovesh","Doyoulovesh","Iloveshtoo",NULL};
// 或
char * str[4] = {"Ilovesh","Doyoulovesh","Iloveshtoo"};

这个用于判定结束的标志叫做哨兵,字符串的哨兵就是 '\0'(也是 0

下面假设没有以上问题

第一份代码里有逻辑错误,while (*strings++ != NULL) 假如 strings0,这里 *strings++ 取了 0 指向的值,并判断了其 != NULL
由于执行了 strings++,下面代码的 strings 就是 1直接绕过了对 0 指向的值(即第一个 char *)的处理,所以还是原样输出 Ilovesh,而且 1 指向的值还未判定,可能已经越界

第二份代码逻辑正确,由于第一个字符串没有 't'(*strings)++ 会走到最后,停在 **strings == '\0' 处,*strings(即第一个 char *) 指向 '\0',所以输出了空字符串


如果不希望改变原数组,可以用临时变量存 *strings,参考代码:

bool findvalue(char ** strings,char ch)
{
    char * string;
    while ((string = *strings++) != NULL)
    {
        while (*string != '\0')
        {
            if (*string++ == ch)
            return true;
        }
    }
    return false;
}

区别就是你第二个 while 开始的 strings 的值在两个版本中时不一样的。一个是改变前的,一个是改变后的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进