【问题标题】:Why sizeof() does'nt return the right length of a char array? [duplicate]为什么 sizeof() 不返回正确长度的 char 数组? [复制]
【发布时间】:2021-12-20 19:22:17
【问题描述】:

所以,我正在尝试按如下方式实现 XOR 加密:

string XOR(char *data, char *key) {
    for (int i = 0; i != sizeof(data); i++)
    {
        data[i] ^= key[i % sizeof(*key)];
    }
    cout << sizeof(data) << "\n";
    return data;
}

这是将datakey作为输入的函数 这里重要的是,对于数组data 中的每个字符,都使用键进行异或运算,因此for 循环:for (int i = 0; i != sizeof(data); i++)...

问题出现在 sizeof(data) 返回 4 或者我的预期输出将是 27 (字母表中的 26 个字母 + 空终止符(我认为))。

程序输出这个:

4
 #"%efghijklmnopqrstuvwxyz

只有前 4 个字母被正确处理。

奇怪的是 sizeof(str) 返回 27 是正确的,那么为什么 sizeof(data) 返回 4 呢?

那么我需要在函数XOR的参数中更改什么?

这是完整的代码:

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

string XOR(char *data, char *key) {
    for (int i = 0; i < sizeof(data) + 1; i++)
    {
        data[i] ^= key[i % sizeof(*key)];
    }
    cout << sizeof(data);
    return data;
}

int main()
{
    char clef[] = "A";
    char str[] = "abcdefghijklmnopqrstuvwxyz";

    cout << XOR(str, clef) << "\n";
}

【问题讨论】:

标签: c++ arrays char


【解决方案1】:

解决方法很简单:不要使用sizeof(),而是使用strlen(),就像这样:

string XOR(char *data, char *key) {
    for (int i = 0; i != strlen(data); i++)
    {
        data[i] ^= key[i % strlen(key)];
    }
    cout << strlen(data) << "\n";
    return data;
}

注意以下情况:

char str[] = "abcdefghijklmnopqrstuvwxyz"; , strlen(str) 将返回 26,而不是使用 sizeof(str) 时的 27

【讨论】:

  • 更糟糕的是,如果您将sizeof 应用于指针(例如data),它会为您提供指针的大小,通常为 4 或 8。
猜你喜欢
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2014-05-25
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多