我告诉你要建立一个模型啊,你看:
***Hello,**world!*******
↑
上面是一个C字符串,你知道C的字符串处理是通过入口指针的,上面那个箭头就是一个指针,它一开始时位于开始位置,这个就是形参char* str。现在我们要把整个字符串扫描一趟,把第一个单词找出来。开始挪动str了哦,你看到那个箭头会动的,OK,就是str++,它每次右移一个字符。任何时候,你都要检查箭头指向的字符到底是什么。通过*str解引用,把字符提取出来,这相当于ch = *str,ch和*str是等价的。由于我们的目的是不要前面的空字符,所以首先检查*str是不是空字符,注意了,并不是只有空格' '才是空字符,所以不能用==' '来判断,必须使用isspace(*str)来判断,这个函数返回真,表示箭头所指向的字符是空字符,返回假则不是。
这样,我们就知道运动逻辑了:箭头不断右移,不断检查它的字符是什么,如果一直都是空字符,while(isspace(*str++)),就继续右移,这个循环的终止,就是isapace(*str)返回假!一旦循环终止,表示箭头已经指到'H'了。这个时候,表示这个位置是应该反馈回去的字符串的入口地址,所以必须把它记住,用一个变量p = str,记住这个位置,后面将会return p,就是返回的指针。
事情还没有完,既然现在找到了单词的入口,就得把单词找完。继续右移箭头,这个时候,不再判断是否isspace(*str)了,而是判断!isspace(*str),这时循环while(!isspace(*str++))是一直找非空字符,直到再一次遇到空字符终止,这时,表明应该把单词结束了,令*str = '\0'即可,这个时候就可以直接return p了。
但这里要注意一个问题:如果形参是char* str,表示str所指向的字符是可以被修改的,如果是const char* str,那么你就不能贸贸然修改这个字符串,这个时候*str = '\0'是会报错的。如果是这样,整个处理就不是那样了。
[ 本帖最后由 TonyDeng 于 2012-12-31 23:30 编辑 ]
***Hello,**world!*******
↑
上面是一个C字符串,你知道C的字符串处理是通过入口指针的,上面那个箭头就是一个指针,它一开始时位于开始位置,这个就是形参char* str。现在我们要把整个字符串扫描一趟,把第一个单词找出来。开始挪动str了哦,你看到那个箭头会动的,OK,就是str++,它每次右移一个字符。任何时候,你都要检查箭头指向的字符到底是什么。通过*str解引用,把字符提取出来,这相当于ch = *str,ch和*str是等价的。由于我们的目的是不要前面的空字符,所以首先检查*str是不是空字符,注意了,并不是只有空格' '才是空字符,所以不能用==' '来判断,必须使用isspace(*str)来判断,这个函数返回真,表示箭头所指向的字符是空字符,返回假则不是。
这样,我们就知道运动逻辑了:箭头不断右移,不断检查它的字符是什么,如果一直都是空字符,while(isspace(*str++)),就继续右移,这个循环的终止,就是isapace(*str)返回假!一旦循环终止,表示箭头已经指到'H'了。这个时候,表示这个位置是应该反馈回去的字符串的入口地址,所以必须把它记住,用一个变量p = str,记住这个位置,后面将会return p,就是返回的指针。
事情还没有完,既然现在找到了单词的入口,就得把单词找完。继续右移箭头,这个时候,不再判断是否isspace(*str)了,而是判断!isspace(*str),这时循环while(!isspace(*str++))是一直找非空字符,直到再一次遇到空字符终止,这时,表明应该把单词结束了,令*str = '\0'即可,这个时候就可以直接return p了。
但这里要注意一个问题:如果形参是char* str,表示str所指向的字符是可以被修改的,如果是const char* str,那么你就不能贸贸然修改这个字符串,这个时候*str = '\0'是会报错的。如果是这样,整个处理就不是那样了。
[ 本帖最后由 TonyDeng 于 2012-12-31 23:30 编辑 ]
授人以渔,不授人以鱼。