c - C 凯撒密码函数调用未按预期运行
问题描述
我正在尝试构建一个程序,该程序将对文本文件执行简单的凯撒密码,其中包含单个字符串,每行没有空格。出于某种原因,我的密码函数没有移动文本,我正在切断各种长度的字符串。你能看到我在 while 循环中搞砸了我的函数调用吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define FILE_NAME "./infile.txt"
void caeser (char * ch, int shift)
{
int i = 0;
int len = strlen(ch);
while (ch[i] < len)
{
if (islower(ch[i]))
ch[i] = ((ch[i] - 'a' + shift) % 26 + 'a');
else
ch[i] = ((ch[i] - 'A' + shift) % 26 + 'A');
}i++;
printf("Caesar Cipher = %s\n", ch);
}
int main(void)
{
char * c = malloc( sizeof(char) * 1000);
FILE* fp = fopen (FILE_NAME, "r");
if (fp == NULL)
{
printf("Can't open %s\n", FILE_NAME);
exit(EXIT_FAILURE);
}
while(fgets(c, sizeof(c), fp) != 0)
{
printf("%s\n", c);
caeser(c, 1);
}
fclose(fp);
fp = NULL;
return 0;
}
解决方案
我对您的代码进行了一些更改,并用粗体标记了它们。
数组从 0 开始,以 n-1 个字符结束。
您检查了 ch[i] < len。ch[i] 是数组 i 位置的字符,而不是数字。
在每次迭代中,您需要将 i 增加 1。这样您就可以获得下一个字符。
为了更好的设计,尝试将可打印格式打磨到主函数,而不是在函数中打印。您应该返回一个指向字符串的指针并在 main.xml 中打印它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define FILE_NAME "./infile.txt"
void caeser (char * ch, int shift)
{
int i = 0;
int len = strlen(ch);
while (**i < len-1**)
{
if (islower(ch[i]))
{
ch[i] = ((ch[i] - 'a' + shift) % 26 + 'a');
**i++;**
}
else
{
ch[i] = ((ch[i] - 'A' + shift) % 26 + 'A');
**i++;**
}
}
printf("Caesar Cipher = %s\n", ch);
}
int main(void)
{
char * c = malloc( sizeof(char) * 1000);
FILE* fp = fopen (FILE_NAME, "r");
if (fp == NULL)
{
printf("Can't open %s\n", FILE_NAME);
exit(EXIT_FAILURE);
}
while(fgets(c, sizeof(c), fp) != 0)
{
printf("%s\n", c);
caeser(c, 1);
}
fclose(fp);
fp = NULL;
return 0;
}
推荐阅读
- weblogic - com.oracle.weblogic.lifecycle.core.PartitionLCMService 错误
- php - Eloquent Query Builder 中的 Laravel 分页
- javascript - 编辑列表中的元素
- sql-server - SQL Server Service Broker 队列错误:“Service Broker 协议传输不可用”
- javascript - 一旦用户键入“#”,文本框中每个单词类型的下拉自动完成菜单
- neo4j - 来自不同节点的同一字段中的 START_ID 和 END_ID
- react-native - 更新 MainApplication.java 后 react-native-navigation 出错
- python - Python-国际象棋导入失败
- javascript - Node.js 与 Electron:: 运行外部命令并在界面上显示标准输出
- wpf - WPF中canvas标签的Clip属性