第一段代码:
#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了。
这两个有区别吗?感谢感谢!
区别就是你第二个 while 开始的 strings 的值在两个版本中时不一样的。一个是改变前的,一个是改变后的。
首先通过
*strings != NULL
判定结束就有问题,就算超过数组长度也不一定是NULL
,除非数组末尾加一个NULL
或把数组长度改为4
(不足默认补0
即NULL
)这个用于判定结束的标志叫做哨兵,字符串的哨兵就是
'\0'
(也是0
)下面假设没有以上问题
第一份代码里有逻辑错误,
while (*strings++ != NULL)
假如strings
是0
,这里*strings++
取了0
指向的值,并判断了其!= NULL
,由于执行了
strings++
,下面代码的strings
就是1
,*直接绕过了对0
指向的值(即第一个 `char)的处理,所以还是原样输出
Ilovesh**,而且
1` 指向的值还未判定,可能已经越界第二份代码逻辑正确,由于第一个字符串没有
't'
,(*strings)++
会走到最后,停在**strings == '\0'
处,*strings
(即第一个char *
) 指向'\0'
,所以输出了空字符串如果不希望改变原数组,可以用临时变量存
*strings
,参考代码: