0

これは私が取り組んでいる質問です。

「テキストを暗号化するための「rotate13」という名前の単純な暗号化スキームは、「z」から「a」または「Z」にループして、13 文字を前方にカウントすることにより、各文字 (a...z または A...Z) を別の文字に変換することです。 ' 必要に応じて 'A' に戻ります. 1 つの null で終わる文字列をパラメータとして受け取り, それを同等の文字列に変換する、rotate13 という名前の関数を作成します. 関数は文字列を直接変更する必要があり, 何も返してはなりません. 覚えておいてください.文字だけを変更する必要があります。他のすべての文字は同じままです。必要に応じてライブラリ内の任意の関数を使用できるように、ctype.h がプログラムの先頭に正しく含まれていると想定できます。"

そして、これは私が得続けるエラーです

"error C2664: 'rotate13' : cannot convert parameter 1 from 'char (*)[10]' to 'char *[]'"   

助けてくれてありがとう。ファイナルの修正に役立ちます。

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

int rotate13(char *array[]);
int size=10;

int main() 
{

    char arr[10];

    printf("Please enter the  letters you wish to encrypt: ");
    scanf("%s",&arr);

    printf("%s",arr);

    rotate13(&arr);

    system ("pause");
    return 0;
}

int rotate13(char *array[])
{
    int pointer;
    while(*array[pointer]!='\0')
    {
        if(isupper(*array[pointer])!=0)
        {
            if(*array[pointer]<'N')
                *array[pointer]=*array[pointer]+13;
            else
                *array[pointer]=*array[pointer]-13;
        }
        else
        {
            if(*array[pointer]<'n')
                    *array[pointer]=*array[pointer]+13;
            else
                *array[pointer]=*array[pointer]-13;
        }
        pointer++;
    }
    printf("%s", *array);

    return 0;
}
4

5 に答える 5

0

いくつかのことを説明する必要があります。"string" in C文字バッファのアドレスです。

の識別子は配列の最初の要素へのポインターarrに分解されるため、scanf の引数に へ のポインターをchar arr[10];指定する必要はありません。(i.e &)string

&arryour scanfasを渡すことによりscanf("%s",&arr);、scanf に渡されるポインターが二重間接ポインター (バッファーの先頭へのポインターへのポインター) になり、プログラムがクラッシュしたり、その他の不適切な動作が発生したりする可能性があります。

cの文字列&arrayは、文字配列の最初の要素のアドレスを暗黙的に渡すため、必要ありません

したがって、2つのステートメントscanf("%s",&arr)は単純scanf("%s",arr)rotate13(&arr)ある必要があり、rotate13(arr). 最初の要素のアドレスが関数呼び出しで暗黙的に渡されることに注意してください。

あなたの機能 rotate13(char *array[ ])はそれを行う完全に間違った方法です

char arr[10] -> can hold single string  ( simply an array )
char *array[] -> can hold multiple strings ( also called array of pointers) 

仮パラメータはrotate13(char array[])またはである必要がありますrotate13(char *array)

あなたのコードを見た後、私はあなたがの内容を変更していないと信じているarrので、call by value代わりにcall by address

char array[] - > call by value , char *array -> call by address

変数int pointerは使用前に初期化されていません。危険です。最初の初期化はゼロです。

のすべてのオカレンスを*array[pointer]に変更array[pointer]

arruse call by addressの内容を変更したい場合は、 に変更rotate13(char array[])rotate13(char *array)、ポインター変数をゼロに初期化することを忘れないでください。

于 2013-11-11T16:11:38.080 に答える
0
  1. &から削除scanf("%s",&arr);

    scanf("%s",arr);

  2. rotate13は type の引数を期待していますがchar **&arr渡すことで type の引数を渡していますint (*)[10]。に渡すarrrotate13問題が解決します。

    rotate13(arr);

于 2013-11-11T15:27:29.587 に答える
0

他の回答が言ったように、あなたはint rotate13(char array[]). コンテキストを理解するには、この素晴らしいページを読む必要があります: http://c-faq.com/aryptr/

基本的に、配列へのポインターを渡すことはここでは冗長です。なぜなら、C では配列を関数に渡すときに、実際に渡されるのはその最初の要素へのポインターだからです。配列は本質的に参照によって渡されます。

于 2013-11-11T15:52:23.947 に答える
0

rotate13(arr);代わりに使用しrotate13(&arr);、パラメーターは代わりに使用する必要がありchar []ますchar *[]

rotate13(&arr);パラメータの不一致を引き起こす関数に配列のアドレスを送信します

于 2013-11-11T15:23:58.893 に答える