做作业的时候遇到的,昨天晚上折腾到一点多才找出来的bug,虽然想想是很弱智的问题,主要是定位花了一点时间;
int split(char *str,char **p)
{
int j;
while(*str == ' ')
{
str++;
}
j = 0;
while(*str!='\0')
{
*p = str;
p++;
str++;
j++;
while(*str != ' ')
{
str++;
}
while(*str == ' ')
{
*str = '\0';
str++;
}
}
return j;
}
这段代码是用指针来在一串带空格的字符中剔除空格,输出各个单词。
乍一看没什么问题,我也是被坑了很久才发现问题在哪里的,是一个坑爹的逻辑问题。
while(*str != ' ')
{
str++;
}
是这段循环造成死循环导致程序出问题的;
输入一串字符,如aaaa后面不带空格就会出问题,while会死循环。
为什么呢?
上面的while循环括号里的内容是str!=‘ ’;
意思是当条件满足时程序会进行下去,只有当str == ' '时才会停止;
如果*str为a或者’\0‘程序都不会停止,会一直进行下去。当输入的字符串内容为|a|a|a|a|a|\0|的时候就没有终止条件了,字符数组内没有’ ‘,循环不会结束。会造成死循环,直到访问非法内存空间,编译器报错。
这是老师上课讲的,很明显的考虑不严谨未考虑到边界条件导致的错误;
她的本来想法应该是指针指向单词的第一个元素,通过上述循环跳过单词的剩余部分,只是循环条件考虑错了,想当然的想单词后面应该是空格,就用空格跳出循环;