1

可能重复:
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不会像你想要的那样表现。在内部encryptsizeof(char *)4(在 32 位机器上)或8(在 64 位机器上),您可以看到是指针的大小。

要获得 ,sizeof(input)您必须更改sizeofstrlen. 因此解决方案=strlen(input)

为什么会这样??当您将数组传递给函数时,该数组在内部表示为指针。在被调用函数的末尾input只是一个指针,它根据您的机器给出字节大小48

要获得sizeofof input,只需使用这样的宏: #define SIZEOF(x) (sizeof(x)/sizeof(x[0])) 并在定义 x. 在你的程序中xinputmain()

于 2012-10-26T06:16:13.413 回答
3

sizeof返回其参数类型的大小。它无法确定指向字符数组的指针中有多少个字符。

strlen如果您知道您的字符串是空终止的,您应该考虑使用该函数。

于 2012-10-26T06:14:05.647 回答
3

input有类型char*(读作“指向字符的指针”)。sizeof(input)给你指针的大小。您可能想使用strlen来查找字符串的长度,或者将长度作为附加参数传递给函数。

于 2012-10-26T06:14:56.480 回答
1

这条线会导致您的问题。

int inputCount = sizeof(input);

sizeof 在这种情况下只确定变量的大小char *。在 32 位系统上,每个指针的大小为 4 个字节。

您无法在运行时确定数组的大小。您可以 * 将输入的大小作为参数传递 * 因为在您的情况下它是一个字符串,如果字符串以 . 结尾,则使用strleninstring.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 回答