1

重複の可能性:
C プログラミング言語の配列のサイズ?

私は C に精通するために C をいじっていましたが、解決方法がわからない初期化/ポインターの問題に遭遇した可能性があると思います。以下のプログラムは ROT13 の実装であるため、入力文字列を受け取り、各文字を 13 ずつシフトして、暗号文を生成します。私のプログラムの出力には正しいシフトが表示されますが、4 文字を超えると機能しません。sizeof が間違って使用されているのではないかと思います。他の提案は大歓迎です。この時点でいくつかのことを台無しにしたと確信しています。

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

void encrypt(char *);

int main(void){

    char input[] = "fascs";
    encrypt(input);

    return 0;
}

void encrypt(char *input){

    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";

    printf("Input: %s \n", input);

    int inputCount = sizeof(input);

    printf("Characters in Input: %i \n\n", inputCount);

    //holds encrypted text
    char encryptedOutput[inputCount];

    //Initialize counters
    int i, j = 0;

    // loop through alphabet array, if input=current letter, shift 13 mod(26),
    // push result to output array, encryptedOutput
    for(i = 0; i < inputCount; i++){
        for(j = 0; j < 26; j++){
            if(input[i] == alphabet[j]){
                encryptedOutput[i] = alphabet[(j + 13) % 26];
            }
        }
    }

    //Nul Termination for printing purposes
    encryptedOutput[i] = '\0';

    printf("Rot 13: %s \n\n", encryptedOutput);

}
4

4 に答える 4

7

sizeof()inencryptは希望どおりに動作しません。内部encryptでは、sizeof(char *)432ビットマシンの場合)または8(64ビットマシンの場合)であり、ポインタのサイズであることがわかります。

を取得するには、に変更するsizeof(input)必要があります。したがって、解=sizeofstrlenstrlen(input)

なぜこれが起こるのですか?配列を関数に渡すと、その配列は内部的にポインターとして表されます。呼び出された関数の最後にinput単なるポインタがあり、マシンに応じて4またはバイトサイズを提供します。8

のを取得するsizeofにはinput、次のようなマクロ を使用します。これを定義#define SIZEOF(x) (sizeof(x)/sizeof(x[0])) する関数で使用します。あなたのプログラムでは、 xxinputmain()

于 2012-10-26T06:16:13.413 に答える
3

inputタイプがありchar*ます(「charへのポインタ」と読みます)。sizeof(input)ポインタのサイズを示します。おそらく、strlenを使用して文字列の長さを見つけるか、追加の引数として長さを関数に渡します。

于 2012-10-26T06:14:56.480 に答える
3

sizeof引数の型のサイズを返します。文字配列へのポインタに含まれる文字数を判別することはできません。

strlen文字列がnullで終了していることがわかっている場合は、関数の使用を検討する必要があります。

于 2012-10-26T06:14:05.647 に答える
1

この行が問題の原因です。

int inputCount = sizeof(input);

この場合、sizeof は変数のサイズのみを決定しますchar *。また、32 ビット システムでは、すべてのポインタのサイズは 4 バイトです。

実行時に配列のサイズを決定することはできません。* 入力のサイズをパラメーターとして渡すことができます * あなたの場合は文字列であるため、文字列が で終了している場合は in を使用してstrlen文字string.h列の長さを取得します\0

ただし、どちらの場合も、単純に出力バッファーを割り当てることはできません。

char output[variable_containing_size];

実行時にメモリを動的に割り当てるために使用malloc()するか、出力パラメータをパラメータとして関数に渡す必要があります。

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

#define BUFFER_LENGTH 80

void encrypt(const char * input, char *output);

int main(void){

    char input[BUFFER_LENGTH] = "fascs";
    char output[BUFFER_LENGTH] = {0}; // initialize every field with \0
    encrypt(input, output);

    return 0;
}
void encrypt(const char *input, char *output){

    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";

    printf("Input: %s \n", input);

    int inputCount = strlen(input);

    printf("Characters in Input: %i \n\n", inputCount);

    //Initialize counters
    int i, j = 0;

    // loop through alphabet array, if input=current letter, shift 13 mod(26),
    // push result to output array, output
    for(i = 0; i < inputCount; i++){
        for(j = 0; j < 26; j++){
            if(input[i] == alphabet[j]){
                output[i] = alphabet[(j + 13) % 26];
            }
        }
    }

    //Nul Termination for printing purposes
    output[i] = '\0';

    printf("Rot 13: %s \n\n", output);

}

ただし、この場合、encrypt()関数はサイズ チェックをまったく行わないため、注意しないと簡単にバッファ オーバーフローが発生する可能性があります。

于 2012-10-26T06:23:00.210 に答える