字串問題
一、#458 ─ The Decoder
題目:按這裡。
說明:將輸入的密碼文字的每個字元加上某個整數 K,解碼成原來的文字。
首先我們先求出這個 K 出來,輸入了字母 J,而輸出字母 C,我們可以推得 K = -7 。這一題我們會用到兩個字元輸入、輸出函數 getchar()、putchar(),這兩個函數如果輸入或輸出失敗,會傳回 EOF 。這一題我們就用一個 while 迴圈,每輸入一個字元,就把它解碼後輸出,而如果輸入的是換行,則不做處理直接輸出。
#include <stdio.h>
int main()
{
char c;
while(1) {
c=getchar();
if(c==EOF) break;
if(c=='\n') putchar(c);
else putchar(c-7);
}
return 0;
}
二、#10082 ─ WERTYU
題目:按這裡。
說明:輸入一段文字,將它們依照鍵盤的位置,印出它們左邊的文字(空白鍵、`、Q、A、Z 等除外)。
這一題和上一題差不多,唯一不同的是修正的地方變得比較複雜,我們寫一個 Correct() 函數來處理它。而主程式改成(黃色為修改的部分):
#include <stdio.h>
int main()
{
char c;
while(1) {
c=getchar();
if(c==EOF) break;
if(c=='\n') putchar(c);
else putchar(Correct(c));
}
return 0;
}
由於鍵盤的位置和 ASCII 值的順序沒有關係,所以我們要用一連串的 if 來判斷它的修正後的值,例如( c 為原來的值、 r 為修正後的值):
char Correct(char c)
{
char r;
if(c=='1') r='`';
if(c=='2') r='1';
if(c=='3') r='2';
......
return r;
}
我們可以把上面一連串的 if 改用 swicth 敘述,switch 敘述的語法如下:
switch(運算式) {
case 值1:
指令1;
break;
case 值2:
指令2;
break;
......
default:
指令N;
break;
}
它將運算式的值計算出來後,會跳到符合該值的 case 處,然後一直執行下去,為避免執行到其他 case 的指令,我們要在指令結束後加上一行 break; 讓它離開這個 switch 敘述。
這一題,為了方便我們輸入程式,建議從鍵盤右邊往左邊打回來,可以利用快速鍵:
Shift + 方向鍵 : 反白文字
Ctrl + Insert : 複製
Shift + Insert : 貼上
Ctrl + KH :解除反白
完整的程式可以參考這裡,我們就不列出來了。