c - fgets() 在输入时创建另一个字符串副本?

标签 c encryption fgets caesar-cipher

我想知道这里的错误是什么?我正在制作一个 caus 密码,它工作正常但是当我在最后打印加密消息时,它会重新打印未加密的消息。当我注释掉并将消息设置为一个句子时,它工作正常。但是当我使用 fgets 获取一个字符串时,它会创建另一个副本。提前致谢!

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>

int main(int argc, char *argv[]) 
{
    char message[100];  
    printf("Please Enter a message to be Encrypted: ");
    fgets(message, 100, stdin);
    unsigned char caeser[] = "";
    int j = 0;
    if(argc >= 2)
    {
    int k = atoi(argv[1]);
    for(int i = 0, n = strlen(message); i < n; i++)
    {
        printf("%i\n",n);
        if(!isspace(message[i]))
        {
            if(islower(message[i]))
            {
                j = message[i] - 97;
                caeser[i] = 97 + ((j + k) % 26);
            }
            if(isupper(message[i]))
            {
                j = message[i] - 65;
                caeser[i] = 65 + ((j + k) % 26);
            }
        }   
        else
        {
            caeser[i] = ' ';
        }
       }
    printf("%s\n", caeser);
    }
}

最佳答案

fgets() 没有问题。这里真正的问题是您没有正确定义数组 caeser

如果您在定义时没有使用足够 初始值设定项进行初始化,则需要显式提供大小。编译时数组不会神奇地根据使用情况扩展。您必须通过明确提及或使用足够数量的初始化器元素对其进行初始化来预先确定大小。

在这里,类似的东西

 unsigned char caeser[100] = {0};

会为您完成这项工作。

关于c - fgets() 在输入时创建另一个字符串副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533387/

相关文章:

java - Java 中的 Vigenere/多字母密码解码器/解密器/解密器

c - c 中的文本文件(int、string、string 和 float)的 fscanf 和 fgets

c - 为什么 `gets_s()` 仍然没有在 GCC (9.3.0) 中实现?

ios - 如何保护我的音乐应用程序下载的音乐文件?

c++ - 在 CUDA __constant__ 内存和多 GPU 上?

ios - AES 256 加密/解密错误 IOS SDK 7

c - 在 C 中搜索 .txt 文件中的字符串?

c - STDIN 重定向 : how to make program end once fgets() reads an expected ending line

c - 如何在不使用 isalpha 的情况下验证 C 中的名称?

c - 在c中使用realloc重新分配二维数组时出错