Sizeof返回错误的数组长度

时间:2012-10-26 06:11:35

标签: c arrays pointers sizeof rot13

  

可能重复:
  Sizeof an array in the C programming language?

我一直在摆弄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 个答案:

答案 0 :(得分:5)

sizeof()中的

encrypt将无法按您的意愿行事。在encrypt内,sizeof(char *)4(在32位计算机上)或8(在64位计算机上),您可以看到它是指针的大小。

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

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

要获取sizeof的{​​{1}},只需使用如下宏: input 并在定义 #define SIZEOF(x) (sizeof(x)/sizeof(x[0]))的函数中使用它。在您的计划中,x中的xinput

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

如果您知道字符串以空值终止,则应考虑使用strlen函数。

答案 3 :(得分:1)

此行会导致您的问题。

int inputCount = sizeof(input);

sizeof仅确定此例char *中变量的大小。并且每个指针在32位系统上的大小为4个字节。

在运行时期间无法确定数组的大小。你可以   *将输入的大小作为参数传递   *因为在你的情况下它是一个字符串,如果字符串被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()函数根本不进行大小检查,如果你不小心,这很容易导致缓冲区溢出。