-2

我正在编写一个将纯文本加密为密文的程序。当我去运行我的程序时,我收到一个分段错误,核心转储错误。

这是我的代码:

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

int main(int argc, string argv[])
{
    int k = 0;

    // continues the program if 2 and no more than 2 command line arguments exist and argv[1] contains alphabetical characters only
    if(argc == 2 && argc == isalpha(argv[1]))
    {
        k = atoi(argv[1]);
    }

    // re-prompts user to enter only 2 command line arguments and the second should consist of only alphabetical characters
    else
    {
        printf("You must enter a command line argument using only alphabetical characters!\n");
        return 1;
    }

    string text = GetString();
    int cipher;
    int key;

    // loops through each charcter in key and gives each character a valule to add to plain text
    for (int j = 0, n = strlen(argv[1]); j < n; j++)
    {
        if (isalpha(argv[1][j]))
        {
            if (isupper(argv[1][j]))
            {
                key = 26 - (91 - argv[1][j]);
            }

            else
            {
                key = 26 - (123 - argv[1][j]);
            }
        }

        else
        {
            key = argv[1][j];
        }

        // loops through plaintext entered by user and changes text to ciphertext according to key
        for (int i = 0, l = strlen(text); i < l; i++)
        {
            if (isalpha(text[i]))
            {
                cipher = (text[i] + key) % n;
                printf("%c", cipher);
            }

            else
            {
                printf("%c", text[i]);
            }
        }
    }
    printf("\n");

}
4

3 回答 3

3

目前也在完成这个确切的教程并遇到了同样的错误。我认为问题在于您在字符串上使用 isalpha(argv[1]) 而我认为 isalpha 仅适用于单个字符。我最终使用 for 循环使用 argv[1][i] 逐个字符地运行 argv[1] 关键字。

对此非常陌生,所以我希望我没有把你引向错误的方向。

于 2014-02-12T20:13:19.450 回答
2
int main(int argc, string argv[])  

应该

int main(int argc, char *argv[])  

C中没有string数据类型。您的编译器应该发出警告。cs50.h在您下载并链接到项目 cs50.c 文件之前,它将无法工作。

此外,isalpha期望类型的参数,int但在你if的条件

if(argc == 2 && argc == isalpha(argv[1])) {...}  

您正在传递一个指向字符串的指针,这是错误的。

正如Elias Van指出的那样,Getstring在堆上分配内存,您需要在使用指针后释放它。

于 2014-02-11T16:12:33.200 回答
1

尝试通过 argv[1] 循环访问组成字符串的字符,即 argv[1][s]。

然后在实际字符上单独使用 isalpha ,即 isalpha(argv[1][s]) 而不是在整个字符串上使用它。

我使用以下函数来执行此任务

// if checker returns 0 then it's all alphabet
int checker(string key)
{
    for(int i = 0, len = strlen(key); i < len; i++)
    {
        if(isalpha(key[i]) == 0)
        {
            return 1;
        }
    }
    return 0;
}
于 2015-03-27T16:10:41.847 回答