iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 9

Day 0x9 UVa272 TEX Quotes

題意

\TeX/
\LaTeX/

  • 輸入一字串,重新排版後輸出
  • 需要注意的有:
    1. 重複輸入直到 EOF
    2. 排版規則
      • 每對 " " 中的第一個替換成 ``
      • 每對 " " 中的第二個替換成 ''

解法

  • while 重複迴圈搭配 gets() 讀取每行輸入,再用 for 逐字元處理
    char str[999] = {0};
    
    while(gets(str)){
        for(i = 0; i < strlen(str); i++){
            ...
        }
        printf("\n");
    }
    
  • 因為只有兩種情況,第一或第二個雙引號,所以可透過 if 濾出雙引號,再用 flag 控制要替換的字元;其餘直接輸出即可
    bool flag = true;
    
    ...
    
    if(flag && str[i] == '"'){
        printf("``");
        flag = false;
    }
    else if(!flag && str[i] == '"'){
        printf("''");
        flag = true;
    }
    else{
        printf("%c", str[i]);
    }
    
  • C code ver. 1
    #include<stdio.h>
    #include<string.h>
    #include<stdbool.h>
    
    int main(){
    
        char str[999] = {0};
        bool flag = true;
        int i;
    
        while(gets(str)){
            for(i = 0; i < strlen(str); i++){
                if(flag && str[i] == '"'){
                    printf("``");
                    flag = false;
                }
                else if(!flag && str[i] == '"'){
                    printf("''");
                    flag = true;
                }
                else{
                    printf("%c", str[i]);
                }
            }
            printf("\n");
        }
    
        return 0;
    }
    
  • 也可改成逐字元輸入,就可不需要 for
    char chr;
    
    while((chr = getchar()) != EOF){
        ...
    }
    
  • C code ver. 2
    #include<stdio.h>
    #include<string.h>
    #include<stdbool.h>
    
    int main(){
    
        char chr;
        bool flag = true;
    
        while((chr = getchar()) != EOF){
            if(flag && chr == '"'){
                printf("``");
                flag = false;
            }
            else if(!flag && chr == '"'){
                printf("''");
                flag = true;
            }
            else{
                printf("%c", chr);
            }
        }
    
        return 0;
    }
    
  • C++
    • 可用 getline() 逐行讀取,或是 cin.get()

上一篇
Day 0x8 UVa10193 All You Need Is Love
下一篇
Day 0xA UVa490 Rotating Sentences
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言