C++我真的想请教一下这个问题,因为已经有很多次是这样子了:PTA的题,输出的部分放在main函数与自定义函数之中,结果不一样

题目如下:

img

我一开始的代码是:

#include <bits/stdc++.h>
using namespace std;
void strmcpy(char *s,char *t,int m)
{
    int i=m-1;
    for(i=m-1;t[i]!='\0';i++)
    {
        *(s+i)=*(t+i);
    }
}


int main()
{
    int repeat,m,i,len;
    char a[1000],b[1000];
    char *s=a,*t=b;
    cin>>repeat;
    for(i=repeat;i>0;i--)
    {
        getchar();
        cin.getline(b,1000);
        len=strlen(b);
        cin>>m;
        if(len<m)
        {
            cout<<"error input"<<endl;
            continue;
        }
        strmcpy(s,t,m);
        for(i=m-1;i<len;i++)
        {
            cout<<*(s+i);
        }
        cout<<endl;
    }
    return 0;
}

结果是这样子的:

img


也就是两次之后并没有停止,还是继续下去

后来改成了:

#include <bits/stdc++.h>
using namespace std;
void strmcpy(char *s,char *t,int m)
{
    int i=m-1;
    for(i=m-1;t[i]!='\0';i++)
    {
        *(s+i)=*(t+i);
    }
    for(i=m-1;i<strlen(t);i++)
        {
            cout<<*(s+i);
        }
        cout<<endl;
}


int main()
{
    int repeat,m,i,len;
    char a[1000],b[1000];
    char *s=a,*t=b;
    cin>>repeat;
    for(i=repeat;i>0;i--)
    {
        getchar();
        cin.getline(b,1000);
        len=strlen(b);
        cin>>m;
        if(len<m)
        {
            cout<<"error input"<<endl;
            continue;
        }
        strmcpy(s,t,m);
    }
    return 0;
}

结果是这样子的:

img

很想弄懂
仅仅是“控制输出的代码块”换了个位置结果就不同了吗

你输入错误了啊
人家输入的是3,你为什么要输入2

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

strmcpy()函数里这句 *(s+i)=*(t+i); 是错误的,s 应该是从 0 开始吧,修改如下,供参考:

#include <iostream>
//#include <bits/stdc++.h>
using namespace std;
void strmcpy(char* s, char* t, int m)
{
    t += m - 1;
    while(*t) *s++ = *t++;
    *s = '\0';
}

int main()
{
    int repeat, m, i, len, k = 0;
    char a[1000], b[1000];
    char* s = a, * t = b;
    cin >> repeat;
    for (i = repeat; i > 0; i--)
    {
        getchar();
        cin.getline(b, 1000);
        len = strlen(b);
        cin >> m;
        if (len < m)
        {
            i == 1 ? cout << "error input" : cout << "error input" << endl;
        }else{
            strmcpy(s, t, m);
            i == 1 ? cout << s : cout << s << endl;
        }
    }
    return 0;
}