回顧知識點:
- memset(a, -1, sizeof(a)); 頭文件爲
#include<cstring>
memset 一般只用來賦值0或者-1 - c = getchar(); 輸入一個字符
scanf("%s", str); 輸入一個字符串,遇到空格或換行符結束
gets(str); 輸入一個字符串,遇到換行符結束 - int len = strlen(str); 返回字符串的長度,有幾個字符就返回幾 “abc”返回3
int cmp = strcmp(str1, str2); 字符串比較(字典序比較,a<b),返回負整數、0、正整數
strcpy(str1, str2); 2複製給1
strcpy(str1, str2); 2拼接到1後面
這裏有一道題,字符串破譯:http://pipioj.online/problem.php?id=1007
題目描述
- 據說最早的密碼來自於羅馬的凱撒大帝。消息加密的辦法是:對消息原文中的每個字母,分別用該字母之後的第5個字母替換(例如:消息原文中的每個字母A 都分別替換成字母F)。而你要獲得消息原文,也就是要將這個過程反過來。
密碼字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
(注意: 只有字母會發生替換,其他非字母的字符不變,並且消息原文的所有字母都是大寫的。)
輸入
- 最多不超過 100 個數據集組成,每個數據集之間不會有空行,每個數據集由 3 部分組成:
起始行: START
密碼消息:由 1 到 200 個字符組成一行,表示凱撒發出的一條消息.
結束行: END
在最後一個數據集之後,是另一行:ENDOFINPUT。
輸出
- 每個數據集對應一行,是凱撒的原始消息。
樣例輸入
- START
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
END
START
N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
END
START
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
END
ENDOFINPUT
樣例輸出
- IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
分析:
- 題目不難但是有時間要求,一個點在字符串輸入,如果用自己判斷輸入,會超時;還有一個在字符替換上,如何寫的優雅簡潔
源碼如下:
#include <cstdio>
#include <cstring>
void slove(char *str) {
int len = strlen(str);
for(int i = 0; i < len; i++) {
if(str[i] >= 'A' && str[i] <= 'Z') {
switch(str[i]) {
// abcdefg higklmn opqrst uvwxyz
case 'A': str[i] = 'V'; break;
case 'B': str[i] = 'W'; break;
case 'C': str[i] = 'X'; break;
case 'D': str[i] = 'Y'; break;
case 'E': str[i] = 'Z'; break;
default: str[i] -= 5;
}
}
}
printf("%s\n", str);
}
int main() {
char str[201];
while(true) {
gets(str); // 輸入的第一行字符
if (str[0] == 'E')
break;
gets(str); // 輸入的第二行字符
slove(str);
gets(str); // 輸入的第三行字符
}
// printf("okok\n");
return 0;
}