一个奇怪的坑点

做作业的时候遇到的,昨天晚上折腾到一点多才找出来的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|的时候就没有终止条件了,字符数组内没有’ ‘,循环不会结束。会造成死循环,直到访问非法内存空间,编译器报错。
这是老师上课讲的,很明显的考虑不严谨未考虑到边界条件导致的错误;
她的本来想法应该是指针指向单词的第一个元素,通过上述循环跳过单词的剩余部分,只是循环条件考虑错了,想当然的想单词后面应该是空格,就用空格跳出循环;

你可能感兴趣的:(一个奇怪的坑点)