【发布时间】:2019-04-14 13:28:31
【问题描述】:
我正在尝试构建一个程序,该程序将对文本文件执行简单的凯撒密码,其中包含单个字符串,每行没有空格。出于某种原因,我的密码函数没有移动文本,我正在切断各种长度的字符串。你能看到我在 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;
}
【问题讨论】:
-
哎哟!
fgets(c, sizeof(c), stdin)只有当c是一个像这样定义的本地数组时才有效:char c[1000]。在您分配内存的情况下,您必须指定分配的长度:fgets(c, 1000, stdin)。 (那是因为sizeof(c)是指针的大小,通常是 4 或 8。) -
while 循环条件看起来……很奇怪。此外,` }i++;` 在 while 循环之外。
标签: c arrays function char caesar-cipher