首页 > 解决方案 > 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;
}

标签: carraysfunctioncharcaesar-cipher

解决方案


我对您的代码进行了一些更改,并用粗体标记了它们。

数组从 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;
}

推荐阅读