Skip to main content

【UVa】272 - TEX Quotes

英文題目傳送門,中文題目傳送門

程式的流程設計是這樣的:
  1. 使用gets收下字串到字元陣列inputString
  2. 初始化用來儲存輸出字元陣列的outputString,以及記錄outputString目前放到哪個字元的outputIndex
    • 注意!這邊的inputStringoutputString建議設到10K,不然會給Runtime Error
    • 注意!這邊不需要初始化用來判斷使用哪個引號的flagQuote,用了反而會得到WA...
  3. 一一比對每個字元,
    • 如果不是雙引號,則將該字元直接儲存到outputStringoutputIndex加一
    • 如果出現雙引號("),則根據flagQuote數值,在outputString中放入左雙引號或右雙引號,outputIndex加二
  4. 最後使用puts(outputString)印出字串


程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc , char *argv []) {
        
    int i;
    int flagQuote = 1;
    
    /* need 100000 to avoid runtime error*/
    char inputString[100000];
    
    /* use gets() to get input string, except /n char*/
    while(gets(inputString)){
        
         /*initialize the containers*/
         int outputIndex = 0;
         char outputString [100000] = {};
        
         for (i = 0; i < strlen(inputString); i++){
             if (inputString[i] == '"'){
                
                 if (flagQuote){
                     /* meet " first time*/
                    outputString[outputIndex] = '`';
                    outputString[outputIndex +1] = '`';
                 } else{
                    outputString[outputIndex ] = '\'';
                    outputString[outputIndex +1] = '\'';
                 }
                flagQuote = (flagQuote == 1)? 0: 1;
                outputIndex +=2;
             }else{
                outputString[outputIndex] = inputString[i];
                outputIndex++;
             }
         }
        puts(outputString);
    }
    return 0;
}
  
另外在網路上有看到更簡潔的方式!直接將雙引號已左雙引號或右雙引號print出來!原來UVa可以不用擠在一行印出來,Orz

修改後的程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc , char *argv []) {
        
    int i;
    int flagQuote = 1;
    
    char inputString[100000];
        
    while(gets(inputString)){
        
         for (i = 0; i < strlen(inputString); i++){
             if (inputString[i] == '"'){
                 if (flagQuote){
                    printf("``");
                 } else{
                    printf("\'\'");
                 }
                flagQuote = (flagQuote == 1)? 0: 1;
             }else{
                printf("%c", inputString[i]);
             }
         }   
        printf("\n");
    }
    return 0;
}
  

想挑戰更難的:102 Ecological Bin Packing

Comments