字符串出现乱码,c++小萌新求助

运行后出现乱码。图片说明
图片说明

 #include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;

void rep(char *str,char *fstr,char *rstr)
{
    int i,j,k,n,x,y=0,cnt=0;
    char sss[50];
    n=strlen(fstr);
    x=strlen(rstr);
    for(i=0;str[i]!='\0';i++) {
        if(str[i]==fstr[0]) {
                k=1;
                j=i+1;
            while(j<i+n) {
                 if(str[j]==fstr[k]) {
                    j++;
                    k++;
                 }
                 else break;
            }
            if(j==i+n) {
               strcat(sss,rstr);
               cnt++;
               i=j-1;
               y=j+(x-n)*cnt-1;
            }
        }
        else sss[y]=str[i];
        y++;
    }

    sss[y]='\0';
    strcpy(str,sss);
}
int main()
{
    char str[50]="iffordowhileelsewhilebreak";
    char fstr[10]="while";
    char rstr[10]="struct";
    /*gets(str);
    gets(fstr);
    gets(rstr);*/
    rep(str,fstr,rstr);
    cout<<str<<endl;
    return 0;
}

 #include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;

void rep(char *str,char *fstr,char *rstr)
{
    int i,j,k,n,x,y=0,cnt=0;
    char sss[50];
    memset(sss, 0, 50); //加上这个
    n=strlen(fstr);
    x=strlen(rstr);
    for(i=0;str[i]!='\0';i++) {
        if(str[i]==fstr[0]) {
                k=1;
                j=i+1;
            while(j<i+n) {
                 if(str[j]==fstr[k]) {
                    j++;
                    k++;
                 }
                 else break;
            }
            if(j==i+n) {
               strcat(sss,rstr);
               cnt++;
               i=j-1;
               y=j+(x-n)*cnt-1;
            }
        }
        else sss[y]=str[i];
        y++;
    }

    sss[y]='\0';
    strcpy(str,sss);
}
int main()
{
    char str[50]="iffordowhileelsewhilebreak";
    char fstr[10]="while";
    char rstr[10]="struct";
    /*gets(str);
    gets(fstr);
    gets(rstr);*/
    rep(str,fstr,rstr);
    cout<<str<<endl;
    return 0;
}

https://ideone.com/LfYSkP
在线测试结果
iffordostructelsestructbreak

没有c币了。
比较奇怪的写法。
1.char str[50]="iffordowhileelsewhilebreak"; 如果要strlen,那么 定义完后。加个\0 .eg: str[手动算位置]='\0';
2. 算好了位置,那么 for(i=0;str[i]!='\0';i++) { 就用长度了strlen,str[i]!='\0' 太奇怪的写法。
根本上就是 str[50],定义完,里面的内容是未定义的。要摸初始化全部为\0,要不算好位置赋值 '\0'

哪里乱码了,没有问题啊

参考stackoverflow上这位老哥写的吧
https://stackoverflow.com/questions/50386791/memory-management-in-replace-function/50387158#50387158

新建一个工程 把代码粘贴进去试一下 我就是这样解决的

  1. 算好了位置,那么 for(i=0;str[i]!='\0';i++) { 就用长度了strlen,str[i]!='\0' 太奇怪的写法。 根本上就是 str[50],定义完,里面的内容是未定义的。要摸初始化全部为\0,要不算好位置赋值 '\0'