又来送分了`求解决cin gets 等等输入有关问题,ACM题目

又来送分了`求解决cin gets 等等输入问题,ACM题目
我在学校的在线平台ACM做题,题目如下面,第三个cin>>m还没有输入就结束了求解决办法,提交上去通过才行哦,就是main函数那3个连续输入

题目描述
有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

输入
数字n 一行字符串数字m

输出
从m开始的子串

样例输入
6
abcdef
3
样例输出
cdef

我的代码:
C/C++ code

include<iostream>
#include<cstdio>
using namespace std;
void abc(char a[],int n,int m,char b[])
{
    int j=0;
    for(int i=m-1;i<n;i++)
    {
        b[j]=a[i];
        j++;
    }
}
int main()
{
    char a[100],b[100];
    int n,m;
    cin>>n;
    gets(a);
    cin>>m;
    abc(a,n,m,b);
    for(int i=0;i<n-m+1;i++)
    {
        cout<<b[i];
    }
    return 0;
}


------解决方案--------------------
C/C++ code
#include <iostream>
#include<cstdio>
using namespace std;
void abc(char a[],int n,int m,char b[])
{
    int j=0;
    for(int i=m-1;i<n;i++)
    {
        b[j]=a[i];
        j++;
    }
}
int main()
{
    char a[100],b[100];
    int n,m;
    cin>>n;
    getchar();//缓冲区的回车符,fflush(stdin)也可以
    gets(a);
    cin>>m;
    abc(a,n,m,b);
    for(int i=0;i<n-m+1;i++)
    {
        cout<<b[i];    //这边应该输出回车...
    }
    return 0;
}

------解决方案--------------------
一般输入数据是以回车作为结束的,但是回车并没有输入到程序里面去,如果下面再出现要输入字符之类的语句,那么这个回车就先被输入,也就是会出现错误,所以在采集数据的时候,特别是好几种数据一起采集的时候,要十分注意回车符的问题。可以使用cin.get();//吸收回车符

C/C++ code
#include<iostream>
using namespace std;

char *mid(char *source,int length,char *destination,int start)
{
    source+=start-1;
    *(destination+--length+1)=0;
    while(length>=0)
    {
        *(destination+length)=*(source+length--);
    }
    return destination;
}

int main()
{
    char a[100],b[100];
    int n,m;
    cin>>n;
    cin.get();//吸收回车符
    gets_s(a);
    cin>>m;
    mid(a,n,b,m);
    for(int i=0;i<n-m+1;i++)
    {
        cout<<b[i];
    }
    return 0;
}

------解决方案--------------------
另外除了cin.get()外,二楼提到getchar()以及cin.ignore()或者cin.clear();cin.sync();
都可以用来吸收回车符的
------解决方案--------------------
楼上的方法还是设置个getchar()最好