字串問題二

一、#272 ─ TeX Quotes

題目:按這裡

說明:將輸入的雙引號 " 改用 `` 及 '' 取代後印出來,第奇數個用 `` 、而偶數個用 ''。

這一題和前兩題很類似,我們同樣一個字一個字讀取進來,如果不是 " ,則直接印出來,如果是雙引號 ",我們則要做一個判斷。我們先用一個整數變數 a 來記錄它是第奇數或偶數個 ",依照 a 的值做不同的輸出。程式如下:

#include <stdio.h>

 

int main()

{

 int a=0;

 char c;

 while(1) {

   c=getchar();

   if(c==EOF) break;

   if(c=='\"')

     if(a==0) {

       printf("``");

       a=1;

     }

     else {

       printf("''");

       a=0;

     }

   else putchar(c);

 }

 return 0;

}

 

二、#494 ─ Kindergarten Counting Game

題目:按這裡

說明:輸入每筆一行資料,計算該行裡面有幾個字(連續的字元)。

這一題我們改用一次讀一行的方式來解題,將讀進來的字串再經過 Count() 函數計算該行有幾個字,再將它印出來。經過測試,本題的字串長度至少要 97 以上,所以我們宣告一個長度為 100 的字串 s。而下面我們會用到一個 isalpha() 的函數來測試某個字元是否為字母,該函數定義在 ctype.h 中。主程式如下:

#include <stdio.h>

#include <ctype.h>

 

int main()

{

 char s[100];

 while(1) {

   if(gets(s)==NULL) break;

   printf("%d\n", Count(s));

 }

 return 0;

}

至於 Count() 函數,我們宣告三個變數,i 記綠目前處理到哪一個字元,n 記錄目前為止有幾個字,而 a 記錄上一個字元是否為字母。我們依照該字元以及上一個字元的不同,有下列四個情況:

  1. 這個字元是字母,而上一個字元不是字母:將 a 設成 1,並將 n 加 1
  2. 這個字元是字母,而上一個字元也是字母:不做處理
  3. 這個字元不是字母,而上一個字元也不是字母:不做處理
  4. 這個字元不是字母,而上一個字元是字母:將 a 設成 0

完整的 Count() 函數如下:

int Count(char s[])

{

 int a, n, i;

 for(a=0, n=0, i=0; s[i]; i++) {

   if(isalpha(s[i]))

     { if(a==0) n++, a=1; }

   else a=0;

 }

 return n;

}

 

三、#10340 ─ All in All

題目:按這裡

說明:輸入兩個字串 s、t,判斷 s 是否為 t 的子字串,即 s 中的每一個字元都出現在 t 中而且順序相同,如果是,則印出 Yes,否則印出 No

這一題的 t 字串,經過測試後,至少要 90001 個字元的長度,不過 Turbo C++ 不接受這麼長的字串,所以我們同樣先用 #define 定義一個常數,等程式完成後,再將它的值改回 90001。這一題我們宣告兩個字串 a、b 分別代表題目中的 s、t,並寫一個 Sub() 函數來判斷 a 是否為 b 的子字串。整個主程式如下:

#include <stdio.h>

#define MAX 200

 

int main()

{

 char a[MAX], b[MAX];

 while(1) {

   if(scanf("%s %s", a, b)<2) break;

   if(Sub(a, b)) printf("Yes\n");

   else printf("No\n");

 }

 return 0;

}

至於 Sub() 函數中,我們用兩個變數 i、j 分別記錄字串 b、a 中的位置,我們把字串 b 從頭到尾掃描一遍,如果和 a 中的字元相同,則把 j 指向 a 的下一個字元,如果 a 中的所有字元全部都比對完了,則 a 是 b 的子字串,便傳回 1,否則 a 不是 b 的子字串,則傳回 0。整個程式如下:

int Sub(char a[], char b[])

{

 int i, j;

 for(i=0, j=0; b[i]; i++)

   if(a[j]==b[i]) {

     j++;

     if(a[j]==0) return 1;

   }

 return 0;

}

 

上一頁

首頁

下一頁