为什么这种遍历字符串的方法是错误的?【问题已解决!谢谢各位】

假设有个字符串:
char str[] = "hello world!";  (对原问题的修改)

第一种遍历方法:
int i = 0;
int length = 0;//统计字符串的长度
while(str[i] != '\0'){
   ++length;
     ++i;    
}
第二种遍历方法:
int length = 0;
while(*str != '\0'){//指针方式遍历
   ++length;
     ++str;    
}  
其中,第一种方式经验证是正确的,第二种方法似乎有问题,请问牛油+牛大大们,第二种遍历字符串的方式那里出错了啊?
====================================================一下为补充==============================
谢谢大家的回复,但是我的纠结不是数组名与指针的关系,数组名能不能加之类的。我是在做《剑指offer》第二题---替换空格中遇到这样的问题:该题的函数接口为:void replaceSpace(char *str,int length),其中有个操作就是遍历传入的str,我开始使用的是第二种方法,但是这样是错误的,使用第一种方法就被AC了。
=====================================贴代码来的直接======================================
class Solution {
public:
	void replaceSpace(char *str,int length) {
        if(str == NULL || length <= 0)
            return ;
        int originallength = 0;
        int blanklength = 0;
            
        int i = 0;
        while(str[i] != '\0'){
            
            ++originallength;
            
            if(str[i] == ' ')
                ++blanklength;
            
            ++i;
        }
        
        int newlength = originallength + blanklength*2;
        if(newlength > length)
            return ;
        
        int p1 = originallength;
        int p2 = newlength;
        
        while(p1 >= 0 && p1 < p2){
            if(str[p1] == ' '){
                str[p2--] = '0';
                str[p2--] = '2';
                str[p2--] = '%';
            }
            else{
                str[p2--] = str[p1];
            }
            -- p1;
        }

	}
}; 
这是AC的代码
开始的代码为:
class Solution {
public:
	void replaceSpace(char *str,int length) {
        if(str == NULL || length <= 0)
            return ;
        int originallength = 0;
        int blanklength = 0;
            
       
        while(*str != '\0'){
            
            ++originallength;
            
            if(*str == ' ')
                ++blanklength;
            
            ++str;
        }
        
        int newlength = originallength + blanklength*2;
        if(newlength > length)
            return ;
        
        int p1 = originallength;
        int p2 = newlength;
        
        while(p1 >= 0 && p1 < p2){
            if(str[p1] == ' '){
                str[p2--] = '0';
                str[p2--] = '2';
                str[p2--] = '%';
            }
            else{
                str[p2--] = str[p1];
            }
            -- p1;
        }

	}
};
该为错误的代码 
以上两次代码的区别就仅仅是while遍历str,一个是指针方式,一个值数组方式,其他都一点没变。
======================================最后补充==================================
问题已经解决! 谢谢各位牛油+牛大大们! (PS:问了一个这么基础的问题,望见谅!)
全部评论
你在遍历字符串长度的时候  用的是str str 已经发生了改变,后面在做替换的时候  str[] 不会是你以为的结果。。 我也不知道有没有解释清楚。。 你把遍历那部分 改成这样就可以了:     char *ptr = str; while(*ptr != '\0'){ ++originallength; if(*ptr == ' ') ++blanklength; ++ptr; }
点赞 回复 分享
发布于 2017-08-18 10:38
循环中++str,到'\0'的时候就str就指向'\0',并不是首地址,你后面用str[p1],str[p2]并没有把str恢复成首地址
点赞 回复 分享
发布于 2017-08-18 10:36
不能用字符串直接初始化指向字符的指针... char *str="ABCDE"这句有问题...
点赞 回复 分享
发布于 2017-08-18 10:32
用指针没有错。。你肯定是其他地方错了。。 我就是用指针实现的那道题。。
点赞 回复 分享
发布于 2017-08-18 10:18
数组名为常量指针!
点赞 回复 分享
发布于 2017-08-18 10:13
因为str是数组名,是常量,不能自增,改成指针的话可以
点赞 回复 分享
发布于 2017-08-18 10:03
数组名不能加
点赞 回复 分享
发布于 2017-08-18 09:58
数组名和指针不是完全一样的吧,可以这样char *str1 = str;用str1循环
点赞 回复 分享
发布于 2017-08-18 09:57

相关推荐

被加薪的哈里很优秀:应该继续招人,不会给你留岗位的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务