C\C++ 知識回顧,memset及字符字符串相關操作,破譯密碼

回顧知識點:

  • 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章