6-4 指定位置輸出字串 (20 分)(附上解析及超重要的點!)
阿新 • • 發佈:2018-12-17
6-4 指定位置輸出字串 (20 分)
本題要求實現一個函式,對給定的一個字串和兩個字元,打印出給定字串中從與第一個字元匹配的位置開始到與第二個字元匹配的位置之間的所有字元。
函式介面定義:
char *match( char *s, char ch1, char ch2 );
函式match應列印s中從ch1到ch2之間的所有字元,並且返回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;
}
/* 你的程式碼將被嵌在這裡 */
輸入樣例1:
program
r g
輸出樣例1:
rog
rogram
輸入樣例2:
program
z o
輸出樣例2:
(空行)
(空行)
輸入樣例3:
program
g z
輸出樣例3:
gram
gram
能夠ac但存在問題的程式碼如下
#include<stdio.h> #include<string.h> #define MAXS 10 char *match( char *s, char ch1, char ch2 ){ char *p=s; char *q=s; int flat1=0; int flat2=0;//定義flat分別用於判斷能不能找到ch1與ch2 int n = strlen(s);//計算輸入字元的長度 int i; int index1,index2; for(i=0;i<n;i++){ if(ch1==s[i]){ flat1=1; index1=i; break; } }//這裡是找ch1的位置,並記錄跳出,記住一定要break for(i=index1;i<n;i++){ if(ch2==s[i]){ flat2=1; index2=i; break; } }//同上,找ch2的位置 if(flat1==0&&flat2==1){ printf("\n"); return 0; }//這個是找不到ch1但是找得到ch2,(實際上是不能返回NULL或者0的【注NULL其實和0等價】) //如果直接返回return (s+index1);應該是可以過的 //**錯誤點就在上面,因為測試資料中沒有測試找不到ch1卻找ch2的資料,所以能夠ac** else if(flat1==0&&flat2==0){ printf("\n"); } //測試資料測的就是兩個都找不到的情況下,最後會執行到最後return (s+index1); //其實返回的就是一個‘\0’ else if(flat1==1&&flat2==0){ for(i=index1;i<n;i++){ printf("%c",s[i]); } printf("\n"); return (s+index1); }//這個是找到ch1而找不到ch2的直接把剩下的都輸出就好了,之前就已經用strlen計算長度了 else if(flat1==1&&flat2==1){ for(i=index1;i<index2+1;i++){ printf("%c",s[i]); } printf("\n"); return (s+index1); } return (s+index1); }
正確的程式碼應該如下
char *match( char *s, char ch1, char ch2 ){ char *p=s;//先指向s while(*p!='\0'&&*p!=ch1){ p++; }//查詢ch1 char *q=p; if(*p==ch1&&*q==ch2){ printf("%c\n",ch1); return p; }//如果ch1與ch2指向同一個字元直接輸出 while(*q!='\0'&&*q!=ch2){ printf("%c",*q++); if(*q==ch2){ printf("%c",ch2); }//這是找的到ch1的情況 //先輸出再自增移動到下一個位置 } printf("\n"); //注意格式,在例子中可以發現有輸出空行 return p; }