찾다

 >  Q&A  >  본문

c++ - gets()得到多行字符串,替换子字符串并且去除连续重复的字符,只有第一次遇到会正常处理,后面的就失效了?

要求输入多行字符串,把'ch'替换成k,把一对重复的字符如'mm'去重改'm';
代码的问题是……如果输入两行,就只有第二行被处理并且put出来
如果输入一行,这一行里的第一对符合条件的字符会被处理,其余的都不会

我对于while (gets(ch)!=NULL)不是很熟,每次读一行的话,按道理应该不会出现这么蠢的问题……希望懂的前辈能指点一下

代码:

int main(){
char  ch[80]={0};
int flag=0;

while (gets(ch)!=NULL) {
    char *p=ch;
    while (*p) {
        if (*p=='c') {
            flag=1;
        }else if(*p=='h'&&flag==1){
            *(p-1)='k';      //找到'ch'并且改成'k'
            while (*p){
                *p=*(p+1);   //'ch'后方的字母依次向前移动
                p++;
            }
            flag=0;
            p--;
        }
        if(*(p-1)) {
            if (*p==*(p-1)) {   //查重复字符串对
                while (*p){
                    *p=*(p+1);   //后方的字母依次向前移动
                    if(*(p+1))
                        p++;
                }
                p--;
            }
        }
        p++;

    }
    
}
puts(ch);

}

黄舟黄舟2803일 전588

모든 응답(1)나는 대답할 것이다

  • PHPz

    PHPz2017-04-17 13:15:48

    看到一个问题

     if(*(p-1)) {   //这里,如果第一个字符就是'c',你这里不就访问越界了吗?
                if (*p==*(p-1)) {   
                    while (*p){
                        *p=*(p+1); 
                        if(*(p+1))
                            p++;
                    }
                    p--;
                }

    在你的程序中,这不止这一处,还有你移动数组的时候,如
    while(p)p=*(p+1)

    회신하다
    0
  • 취소회신하다