-2

平文を暗号文に暗号化するプログラムを書いています。プログラムを実行しようとすると、Segmentation Fault, core dumped エラーが発生します。

これが私のコードです:

#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

2
int main(int argc, string argv[])  

する必要があります

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

C にはデータ型がありませんstring。コンパイラは警告を発するはずです。プロジェクト cs50.c ファイルcs50.hをダウンロードしてリンクするまでは機能しません。

また、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(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 に答える