-3

このソース コードを長い間修正しようとしてきましたが、コンパイラはまだエラーを示しています。

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

int main(int argc, char* argv[])
{
    char ptext[40];
    int i=0;
    if(argc!=2)
    {
        printf("invalid key");
        return 1;
    }
    else
        printf("enter plain text\n");
    ptext= GetString();
    int key= atoi(argv[1]);
    int n=strlen(ptext);
    while( ptext[i]!= '\0')
    {
        if( ptext[i]>65 && ptext[i]<90)
        {
            int c= (ptext+key)%26;
            int d= c+26;
            printf("%c", d);
        }
        else if( ptext[i]>97 && ptext[i]<122)
        {
            int c= (ptext+key)%26;
            int d= c+26;
            printf("%c", d);
        }
        else
        {
            printf("%c",ptext[i]);
        }
        i++;
    }
}

コンパイル中に表示されるエラーはarray type 'char [40]' is not assignable(40 未満の数値を入力したり、括弧を空のままにしても何もしません)、およびinvalid operands to binary operation int c = (ptext+key)%26.

4

2 に答える 2

1

いくつかのこと:

本当に必要なptextのはchar*、配列ではなく です。文字列または/GetString()を返すと思います。動作の仕方によっては、返品をテストする必要がある場合があります。char[]char*GetString()NULL

int c= (ptext+key)%26;で、処理しようとしているように見えますptext[i]。おそらく、インデクサーを含めるのを忘れていませんか?

また、ASCII を使用している場合は、数字の代わりに値自体if( ptext[i]>65 && ptext[i]<90)を使用できるような行charで、ASCII テーブルを詳しく調べる必要がないようにすることをお勧めします。次のように実行できますif(ptext[i] >= 'A' && ptext[i] <= 'Z')

上記にも注意してください。また、コンパレータ><>=とに変更しました<='A'とは'Z'有効な文字ですか?

モジュロをそのまま使用する場合、Caesar Cipher の場合、アルファベットの文字のインデックスが必要です。したがって、大文字の場合は、'A'「int c= (ptext[i] - 'A' + key) % 26;」のように減算します (または、よく知られているように、ASCII では 65 です)。

于 2014-08-21T19:34:36.073 に答える