R语言实现凯撒密码(Caesar Cipher)时空格无法正常转换问题
R实现凯撒密码的空格处理问题修复
问题现象
当前R编写的凯撒密码实现,仅能对不含空格的纯字母字符串完成正常移位转换,遇到带空格的输入会返回错误结果:
- 输入
"AB"时可正常完成1-26位全移位量的转换 - 输入
"A B"(A与B之间包含2个半角空格)时无法输出正确结果
原有问题代码如下:
Caesar = function(input){ answer = "" solution = NULL Low = "abcdefghijklmnopqrstuvwxyz" Up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Lower = strsplit(Low,"") Lower = Lower[[1]] Upper = strsplit(Up, "") Upper = Upper[[1]] cutI = strsplit(input,"") cutI = unlist(cutI) df_Result = data.frame(n.Kan = 1:26) for(n in 1:26){ answer = "" for (i in cutI){ if (i %in% ""){ answer = paste0(collapse = "") } else if (i %in% Lower){ ind = which(Lower == i) indN = (as.numeric(ind)+n)%%26 if(indN %% 26==0){ indN = 26 } answer = paste0(c(answer, Lower[indN]),collapse="") } else{ ind = which(Upper == i) indN = (as.numeric(ind)+n)%%26 if(indN%%26==0){ indN = 26 } answer = paste0(c(answer, Upper[indN]), collapse = "") } answer=paste0(answer, collapse="") } solution = c(solution,answer) } df_Result = cbind(df_Result , "Result" = solution) return(df_Result) }
错误原因
空格处理的分支存在两处逻辑错误:
- 匹配条件写错:代码里判断的是空字符串
"",但实际输入里的空格是带半角空格的" ",根本进不到空格处理分支 - 分支逻辑错误:就算匹配到对应字符,代码里执行
answer = paste0(collapse = "")会直接清空之前已经拼接好的转换结果,也不会把空格保留到输出字符串里
修复后代码
只需要修正空格判断的条件和对应拼接逻辑,顺带删掉循环里冗余的重复拼接代码即可,修复后的完整代码:
Caesar = function(input){ answer = "" solution = NULL Low = "abcdefghijklmnopqrstuvwxyz" Up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Lower = strsplit(Low,"")[[1]] Upper = strsplit(Up, "")[[1]] cutI = unlist(strsplit(input,"")) df_Result = data.frame(n.Kan = 1:26) for(n in 1:26){ answer = "" for (i in cutI){ # 修正空格匹配条件和拼接逻辑 if (i == " "){ answer = paste0(c(answer, " "), collapse = "") } else if (i %in% Lower){ ind = which(Lower == i) indN = (as.numeric(ind)+n)%%26 if(indN %% 26==0){ indN = 26 } answer = paste0(c(answer, Lower[indN]),collapse="") } else{ ind = which(Upper == i) indN = (as.numeric(ind)+n)%%26 if(indN%%26==0){ indN = 26 } answer = paste0(c(answer, Upper[indN]), collapse = "") } } solution = c(solution,answer) } df_Result = cbind(df_Result , "Result" = solution) return(df_Result) }
修复后测试输入"A B",移位量为1时返回结果为"B C",空格位置完全保留,大小写字母移位逻辑不受影响。
内容的提问来源于stack exchange,提问作者HHOHOI
相关产品推荐
相关产品推荐

