PTA指定位置輸出字元
阿新 • • 發佈:2020-12-25
**
PTA指定位置輸出字串**
題目:本題要求實現一個函式,對給定的一個字串和兩個字元,打印出給定字串中從與第一個字元匹配的位置開始到與第二個字元匹配的位置之間的所有字元。
函式介面定義:
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
話不多說,直接上程式碼:
char *match( char *s, char ch1, char ch2 )
{
int i,j;
for(i = 0;s[i] != '\0';i++)
{
if(s[i] == ch1) //如果ch1找到
{
for(j = i;s[j] != ch2 && s[j] != '\0';j++)
printf ("%c",s[j]); //輸出ch1後的字元
//如果ch2存在,則以下條件將其輸出
if(s[j] != '\0')
printf("%c\n",s[j]);
else
printf("\n");
return s+i;
}
//ch1未找到,ch2找到(7是program的長度)
if(i==7)
printf("\n");
}
}
*手動分割線 手動分割線 手動分割線 手動分割線 *
問題1:
如果沒有以下程式碼:結果會如何?
//ch1未找到,ch2找到(7是program的長度)
if(i==7)
printf("\n");
輸入樣例:
//區別與7個字元的program
apprentic
g e
輸出樣例:(pta)
按照樣例2可知,該輸出的結果是錯誤的。PTA中對輸出結果加空行,想要得到樣例2的結果,輸出結果應該為3行空行。
如下圖,為新增後的結果,同時該結果也是正確結果:(PTA)
問題2:
程式碼中7的來源以及一般化解決方案:
含有7的程式碼如下:
//ch1未找到,ch2找到(7是program的長度)
//含有7的程式碼
if(i==7)
printf("\n");
根據樣例2及測試點結果,可知測試點2的內容應該就是有7個字元的program。如果測試點不為program,如問題1中輸入樣例中的apprentic(9個字元),對於不確定長度的樣例,應該對其進行調整。
如果能夠使用strlen(),可以直接求出長度。
該程式標頭檔案不包含#include<string.h>,故通過迴圈計數來得出長度。
改善後的程式碼如下:
char *match( char *s, char ch1, char ch2 )
{
int i,j;
int num=0;
for(int k=0;s[k] != '\0';k++) //計算長度
num++;
for(i = 0;s[i] != '\0';i++)
{
if(s[i]==ch1)
{
for(j=i;s[j] != ch2 && s[j] != '\0';j++)
printf("%c",s[j]);
//如果ch2存在,則以下條件將其輸出
if(s[j]!='\0')
printf("%c\n",s[j]);
else
printf("\n");
return s+i;
}
//ch1未找到,ch2找到
i++; //確保下一步判斷正確
if(i==num)
printf("\n");
}
}