当前位置:优学网  >  在线题库

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

发表时间:2022-06-25 23:43:14 阅读:58

第一段代码:

#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了。

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

🎖️ 优质答案
  • 首先通过 *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 的值在两个版本中时不一样的。一个是改变前的,一个是改变后的。

  • 相关问题