指定位置输出字符串C语言

不太明白为什么最后返回ch1的地址为什么是$而且还会溢出、

#include <stdio.h>

#define MAXS 10

char *match( char *s, char ch1, char ch2 );

int main()
{
    char str[MAXS], ch_start, ch_end, *p;
    
    scanf("%s\n", str);
    scanf("%c %c", &ch_start, &ch_end);
    p = match(str, ch_start, ch_end);
    printf("%s\n", p);

    return 0;
}

/* 你的代码将被嵌在这里 */
char *match( char *s, char ch1, char ch2 )
{
    char* p,* q;
    p=s;
    q=&ch1;
    while(*p++)
    {
        if(*p<=ch1&&*p>=ch2)
        {
            printf("%c",*p);
        }
    }
    printf("%s",q);
    return q;
}

img

scanf后用户手动回车被读入了,为了避免错误读入,scanf前先getchar()捕捉到无用的回车,在scanf读入。

代码如下,仅供参考!谢谢

img

img

#include <stdio.h>
 
#define MAXS 20
 
char *match( char *s, char ch1, char ch2 );
 
int main()
{
    char str[MAXS], ch_start, ch_end, *p;
    
    scanf("%s", str);
    getchar();
    scanf("%c %c", &ch_start, &ch_end);
  
    p = match(str, ch_start, ch_end);
    printf("%s\n", p);
 
    return 0;
}
 
/* 你的代码将被嵌在这里 */
char *match( char *s, char ch1, char ch2 )
{
    //char *p,*q;
    int index1=-1;  //记住起始索引位置
  
    int i=0;
    char *p=s,*q=NULL;
    //q=&ch1;//逻辑上有点问题
    for(;*(p+i)!='\0';i++)
    {
        //if(*p<=ch1 && *p>=ch2)
        //这判断语句不符合逻辑!
        if(*(p+i)==ch1 && index1==-1)
        {
            
            index1=i;
            
        }
        if(*(p+i)==ch2 && i>=index1)
        {
            *(p+1+i)='\0';
            break;
        
        }
        
    }
    q=p+index1;
    
    return q;
}