0

ユーザー入力とユーザー Caesar cypher を読み取って暗号化する必要があります。しかし、ユーザー入力を読み込んでいるときに、たとえば次のように入力するとプログラムが終了しないという問題が発生しました: " ./caesar 3 I'm" 問題は文字のよう'です。プログラムは他の入力に対しても機能します。

/**
 *
 * caesar.c
 *
 * The program caesar encrypts a String entered by the user
 * using the caesar cipher technique. The user has to enter
 * a key as additional command line argument. After that the
 * user is asked to enter the String he wants to be encrypted.
 *
 * Usage: ./caesar key [char]
 *
 */

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

int caesarCipher(char original, int key);

int main(int argc, string argv[])
{
    if (argc > 1)
    {    
        int key = atoi(argv[1]);    

        for (int i = 2; i < argc; i++)
        {
            for (int j = 0; j < strlen(argv[i]); j++)
            {
                argv[i][j] = caesarCipher(argv[i][j], key);
            }
        }

        for (int i = 2; i < argc; i++)
        {
            printf("%s", argv[i]);
        }

        return 0;
    } 
    else
    {
        printf("The number of command arguments is wrong! \n");

        return 1;
    }
}

int caesarCipher(char original, int key)
{
    char result = original;

    if (islower(original))
    {
        result = (original - 97 + key) % 26 + 97;
    }
    else if (isupper(original))
    {
        result = (original - 65 + key) % 26 + 65;   
    }

    return result;
} 
4

1 に答える 1

5

シェルは'、 を文字列の開始と解釈します。したがって、次のいずれかでエスケープする必要があります。

./シーザー 3 私は

または、引数を二重引用符で囲みます。

./シーザー 3 「私は」

これはあなたのプログラムとは何の関係もないことに注意してください。これを処理するのはコマンドライン シェルだけです。

于 2012-11-26T09:17:09.650 に答える