初学者帖,寻大神解释程序运行的毛病

菜鸟求助帖,寻大神解释程序运行的毛病
//对一个长度为n的字符串从其第k个字符起,删去m个字符,组成长度为n-m新字符串,并输出处理后的字符串。用自定义函数实现。
#include <stdio.h>
#include <stdlib.h>
char *fact(int n,int m,int k,char *str1,char *str2);
int main()
{
int n,m,k,i;
char *str1,*str2;
printf("请输入长度n:\n");
scanf("%d",&n);
str1=(char*)malloc(n*sizeof(char));
printf("请输入删去字符的个数m:\n");
scanf("%d",&m);
str2=(char*)malloc((n-m)*sizeof(char));
printf("请输入开始删除的字符个数:\n");
scanf("%d",&k);
printf("请输入长度为%d的字符串:\n",n);
for(i=0;i<n;i++)
{
scanf("%c",str1+i);
}
str2=fact(n,m,k,str1,str2);
printf("处理后的字符串为:%s\n",str2);
return 0;
}
char *fact(int n,int m,int k,char *str1,char *str2)
{
int i;
for(i=0;i<k;i++)
{
*(str2+i)=*(str1+i);
}
for(i=0;i<m;i++)
{
*(str2+k+i)=*(str1+k+m+i);
}
*(str2+k+i)='\0';
return str2;
}
用VC6.0运行之后最后一位总带个?,可能存在的问题不止一处,望大神指点。
------解决思路----------------------
/**************************************
 *FILE    :D:\c\main.c
 *PROJECT :NULL
 *AUTHOR  :707wk
 *CREATED :2015-5-14 下午 10:18:01
 *TEXT    :对一个长度为n的字符串从其第k个字符起,删去m个字符并输出
 *EMAIL   :gtsoft_wk@foxmail.com
 *CODE    :https://github.com/707wk
***************************************/

#include <stdio.h>

void strcatstr(char* str1,char *str2)
{
while(*str1)str1++;
while(*str1++=*str2++);
}

int main()
{
int start;
int end;
char str[100];
printf("请输入字符串:\n");
scanf("%s",str);
    printf("请输入开始删除的字符位置:");
    scanf("%d",&start);
    printf("请输入删去字符的个数:");
    scanf("%d",&end);
    
    str[start-1]='\0';
strcatstr(str,str+start+end-1);

    printf("处理后的字符串为:%s\n",str);
    return 0 ;
}
初学者帖,寻大神解释程序运行的毛病
------解决思路----------------------
还得确保你的输入是合法的