gpt4 book ai didi

arrays - 不确定为什么 toupper() 会切断 C 中的最后一个字母

转载 作者:行者123 更新时间:2023-12-04 12:04:35 27 4
gpt4 key购买 nike

因此,该程序的目标基本上是在终端中使用 26 个字母的“ key ”(通过 argv[])并使用其索引作为替代指南。因此,您在终端中输入了 2 个输入,一个在 argv[] 中。一个只是一个普通的get_string()输入。 argv[]输入将如下所示:./s YTNSHKVEFXRBAUQZCLWDMIPGJO哪里s是文件名。然后是 get_string()输入将如下所示:plaintext: HELLO . (输入是 HELLO )。然后程序将循环遍历纯文本输入中的所有字母,并根据 argv[] 的索引替换其字母索引。 key 。例如,H有一个字母索引 7 (其中 a = 0 和 z = 25),因此我们查看键 YTNSHKV(E)FXRBAUQZCLWDMIPGJO 中的第 7 个索引在这种情况下是 E .它对输入中的每个字母执行此操作,我们最终会得到输出 ciphertext: EHBBQ .这是它在终端中的样子:

./s YTNSHKVEFXRBAUQZCLWDMIPGJO
plaintext: HELLO
ciphertext: EHBBQ
但我的输出是 EHBB ,因为当我使用 toupper() 时它出于某种原因切断了最后一个字母.
而且,大写和小写取决于明文输入,如果明文输入是 hello, worldargv[] key 是 YTNSHKVEFXRBAUQZCLWDMIPGJO ,输出将为 jrssb, ybwsp ,如果输入是 HellO, world使用相同的 key ,输出将为 JrssB, ybwsp .
我基本上已经解决了这个问题,我的程序根据通过命令行输入的 key 将给出的明文替换为正确的密文。现在,假设明文输入是 HELLO ,关键是 vchprzgjntlskfbdqwaxeuymoi (全部小写),那么它应该返回 HELLO而不是 hello .这是因为我的程序将命令行键中的所有字母放入长度为 26 的数组中,并且我遍历所有纯文本字母并将其 ascii 值(减去某个数字以使其进入 0-25 索引范围)与键中的索引。所以 E有一个字母索引 4 所以在这种情况下我的程序会变成小写 p ,但我需要它是 P ,这就是我使用 toupper() 的原因.
当我使用 tolower() ,一切正常,一旦我开始使用 toupper() , ciphertext的最后一个字母由于某种原因被切断。这是我使用之前的输出 toupper() :
ciphertext: EHBBQ
这是我使用 toupper() 后的输出:
ciphertext: EHBB
这是我的代码:
int main(int argc, string argv[]) {
string plaintext = get_string("plaintext: ");

// Putting all the argv letters into an array called key
char key[26]; // change 4 to 26
for (int i = 0; i < 26; i++) // change 4 to 26
{
key[i] = argv[1][i];
}

// Assigning array called ciphertext, the length of the inputted text, to hold cipertext chars
char ciphertext[strlen(plaintext)];

// Looping through the inputted text, checking for upper and lower case letters
for (int i = 0; i < strlen(plaintext); i++)
{
// The letter is lower case
if (islower(plaintext[i]) != 0)
{
int asciiVal = plaintext[i] - 97; // Converting from ascii to decimal value and getting it into alphabetical index (0-25)
char l = tolower(key[asciiVal]); // tolower() works properly
//printf("%c", l);
strncat(ciphertext, &l, 1); // Using strncat() to append the converted plaintext char to ciphertext
}
// The letter is uppercase
else if (isupper(plaintext[i]) != 0)
{
int asciiVal = plaintext[i] - 65; // Converting from ascii to decimal value and getting it into alphabetical index (0-25)
char u = toupper(key[asciiVal]); // For some reason having this cuts off the last letter
strncat(ciphertext, &u, 1); // Using strncat() to append the converted plaintext char to ciphertext
}
// If its a space, comma, apostrophe, etc...
else
{
strncat(ciphertext, &plaintext[i], 1);
}
}

// prints out ciphertext output
printf("ciphertext: ");
for (int i = 0; i < strlen(plaintext); i++)
{
printf("%c", ciphertext[i]);
}
printf("\n");
printf("%c\n", ciphertext[1]);
printf("%c\n", ciphertext[4]);
//printf("%s\n", ciphertext);
return 0;
}

最佳答案

strncat函数期望它的第一个参数是它附加到的空终止字符串。你用 ciphertext 调用它虽然它未初始化。这意味着您正在读取未初始化的内存,可能读取到数组末尾,触发 undefined behavior .
您需要制作 ciphertext打电话之前的空字符串 strncat在上面。此外,您需要将此数组的大小加 1 以说明已完成字符串上的终止空字节,以防止写掉它的末尾。

char ciphertext[strlen(plaintext)+1];
ciphertext[0] = 0;

关于arrays - 不确定为什么 toupper() 会切断 C 中的最后一个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68834216/

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