c - 使用命令行参数解密和加密文本

标签 c debugging segmentation-fault

我正在尝试制作一个程序,当用户输入他们想要为 argv[2] 加密/解密的字符串时,该程序将进行加密和解密。并为 argv[3] 输入“加密”或“解密” .这是我现在尝试编译和运行的代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    int i;
    // char *string;
    char *key_ch;
    char  key_int;
    char *string_ = calloc(80, 1);
    string = argv[1];
    char encrypted_string[strlen(string)];
    char decrypted_string[strlen(string)];
    //char *key_ch;
    //char key_int;
    string = argv[1];
    key_ch = argv[2];
    key_int = atoi(key_ch);

    if (argc < 3)
    {
       printf("Not enough arguments!\n");
       exit (1);
    }

    if (strcmp(argv[3], "encrypt") == 0)
    {
            i = 0;
            while(i <= strlen(string)-1)
            {
                    encrypted_string[i] = string[i] + key_int;
                    i++;
            }

    //      printf("Encrypted string: ");
            i = 0;
            while (i <= strlen(string) -1)
            {
                    printf("%c", encrypted_string[i]);
                    i++;
            }
            printf("\n");
    }
    if (strcmp(argv[3], "decrypt") == 0)
    {
            i = 0;
            while(i <= strlen(string) -1)
            {
                    decrypted_string[i] = string[i] - key_int;
                    i++;
            }

    //      printf("Decrypted String: ");
            i = 0;
            while (i <= strlen(string) -1)
            {
                    printf("%c", decrypted_string[i]);
                    i++;
            }

            printf("\n");

    }
    return 0;
}

当我尝试在没有 -Wall 的情况下编译它时命令它编译得很好但是当我运行程序时我遇到了段错误,当我用 -Wall 编译时我得到了

sam0.c:9:24: warning: 'string' is used uninitialized in this function [-Wuninitialized]

char encrypted_string[strlen(string)];

谁能解释一下这个错误?谢谢

编辑: 根据您的建议更改了我的代码。即使在使用“-Wall”时我也根本没有遇到编译错误,但是在我的程序中的某个地方它导致我遇到段错误......有什么想法吗?我在更改代码的地方加上引号以供引用,以防我做错了。

最佳答案

warning: 'string' is used uninitialized in this function [-Wuninitialized]

char *string; 创建一个指向 char 的指针。此时它还不是字符串,但您将其用作字符串参数。

在使用 char *string; 之前,它必须分配内存,并且应该初始化。在其他方法中,这可以通过以下方式完成:

char *string = calloc(80, 1);//initializes with known values (NULL).  

现在 string 可用,但长度为零。可以通过字符串函数分配值:

strcpy(string, argv[1]);
sprintf(string, "%s", argv[1]);
strcat(string, argv[1]);

... more string functions

当使用命令行输入时,argv、argcmalloc/calloc 和字符串 cpy 函数可以通过使用 strdup 来避免。可以像这样分配一个值:

if(argc == 2)
{
    char *string = strdup(argv[1]);
    if(!string) return -1;
    ...

编辑(处理您的 OP 编辑​​)
您现在使用两个不同的变量:string_string

char *string_ = calloc(80, 1);
            ^
string = argv[1];

在您的代码中使它们相同,它应该构建并运行。

关于c - 使用命令行参数解密和加密文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36179391/

相关文章:

debugging - F#生活质量问题

arrays - Fortran 90 - "Segmentation fault - invalid memory reference"具有可扩展的 3D 数组

C - 从字符串中提取所有数字

c++ - Windows命令提示符中的彩色文本一行

c - 遍历 const 矩阵和 vector

node.js - C9.IO - 调试失败 - 无法在端口 15400 上打开套接字,等待 1000 毫秒再重试

c - fclose() 期间的段错误

c - 使用getopt_long,如何在optarg中存储两个值?

c++ - 在 C++ 中等效的 open(file, O_NONBLOCK)

php - PHP解析/语法错误;以及如何解决它们