【问题标题】:C Caesar Cipher Function Call Not Behaving as ExpectedC 凯撒密码函数调用未按预期运行
【发布时间】: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


【解决方案1】:

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

数组从0开始,以n-1个字符结束。

你检查了 ch[i]

在每次迭代中,您需要将 i 增加 1。这样您就可以获得下一个字符。

为了更好的设计,尝试将可打印格式打磨到主函数,而不是在函数中打印。您应该返回一个指向字符串的指针并在 main 中打印它。

#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;
}

【讨论】:

  • * 在 C 中表示某些东西,因此尝试像以前那样标记行并不是一个好主意。相反,发布无需修改即可编译的代码,您可以在之后描述更改,也可以使用代码 cmets
  • while(fgets(c, sizeof(c), fp) != 0) 不正确。 c 是指针,sizeof(c) 是指针的大小
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多