gpt4 book ai didi

c - 在 C 函数中返回 char 数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:07 26 4
gpt4 key购买 nike

我在编写一个非常小的 C 程序时遇到了很多问题。浏览了我能找到的所有堆栈溢出文章,但没有取得多大成功。该程序假设对纯文本字符串使用非常简单的 XOR“加密”。输入字符串和键都是 6 个字符长。我是 C 和指针的新手。我想我没有掌握这门语言的一些基础知识。

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

#define LENGTH 7
#define KEY "secret"

char * encryptDecrypt(char *plaintext);

int main(int argc, char **argv)
{
if(argc > 1)
{
char *plainText = argv[1];
printf("Encrypting plaintext: %s (%i)\n", plainText, strlen(plainText));
char *cipherText = encryptDecrypt(plainText);
printf("Encrypted: %s (%i)\n", cipherText, strlen(cipherText));
char *decryptedText = encryptDecrypt(cipherText);
printf("Decrypted: %s (%i)\n", decryptedText, strlen(decryptedText));
}
return 0;
}

char * encryptDecrypt(char *text)
{
char result[LENGTH];
for (int i = 0; i < LENGTH-1; i++)
{
result[i] = (char)(text[i] ^ KEY[i]);
}
char *resultPtr = &result;
return resultPtr;
}

使用 arg "foobar"输出运行程序:

加密明文:foobar (6)

加密:╠╠╠╠╠╠╠╠T¨ (19)

解密:╠╠╠╠╠╠╠╠T¨ (19)

问题:

  1. 打印指向结果数组的指针在 encryptDecrypt 函数中使用时和返回后是不同的
  2. 对密文使用 XOR 并不能将其还原为原始纯文本(尽管因为我打印的内容有误,这部分可能没问题)
  3. 加密/解密文本的字符串长度是 19 个字符长?如果原始字符串是 6 个字符,这怎么可能?

最佳答案

 char *resultPtr = &result;
return resultPtr;

你不能这样做。函数结束时result不存在,不能返回result

像这样修改你的函数:

void encryptDecrypt(char *text, char *result)
{
for (int i = 0; i < LENGTH - 1; i++)
{
result[i] = (char)(text[i] ^ KEY[i]);
}
}

在调用方站点创建一个数组,并将其作为结果 传递。例如

char result[LENGTH] = {0}; 
encryptDecrypt(plainText, result);

注意:实际上使用%s 来打印加密数据并不是最好的主意,因为例如作为 XOR 的结果,您可能会在文本之间得到一个空字节,这将被视为字符串的空终止符,并且 printf 不会显示字符串的其余部分。考虑像 this 这样的东西用于打印密文。

strlen 的格式说明符也是错误的,使用 %zu 代替 %i,否则您将触发 undefined behaviour .

关于c - 在 C 函数中返回 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35369246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com