- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,该程序的目标基本上是在终端中使用 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, world
和
argv[]
key 是
YTNSHKVEFXRBAUQZCLWDMIPGJO
,输出将为
jrssb, ybwsp
,如果输入是
HellO, world
使用相同的 key ,输出将为
JrssB, ybwsp
.
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/
使用 String.toUpper() 时尝试“格式化”不包含大写字符(例如阿拉伯语)的语言时,是否必须采取任何其他预防措施? string arabic = "مرحبا بالعالم"; str
对于以下功能 void display() { for (int i = 0; i 97 && (i+j)%2 == 0) SetConsoleTextAtt
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
这里我检查输入数组 (inputText[]) 中的每个字符是否至少与 LETTERS 数组中的一个字母匹配。但 toupper() 函数对我不起作用。我正在 Linux mint 上工作并使用 gc
我在尝试理解 toupper() 函数时面临一个有趣的问题。请找到下面的代码:这里的问题是在输出中我总是缺少输入字符串的第一个字符。 请纠正我的错误。我在谷歌搜索了太多之后才发布此内容。 void U
这个问题已经有答案了: Lowercase characters to Uppercase characters in C & writing to file (1 个回答) 已关闭 7 年前。 我正
我尝试了以下方法:*string = toupper(*string); 这仅使指针指向的字符串指针的第一个字符变为大写。我希望 *pointer 指向的所有字符指针均为大写。无论如何我可以做到这一点
我正在从服务器传递一条消息,该消息存储在一个名为 strObject 的字符串变量中。我希望将 strObject 中的字符串转换为大写。所以,我使用 ToUpper() 方法。但是,当我添加一个断点
我正在使用 substring 和 IndexOf 来定位字符串中的值,但如果下面的字符串 (strOldValue) 包含不同大小写的任何字符串,我的代码将不起作用。因此,如果 strOldValu
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Convert a String In C++ To Upper Case 你好,我需要一个可移植的函数来将
我正在尝试将字符串转换为大写以便我可以对其进行操作,但是虽然我可以成功地操作自然大写字符串以及将小写转换为大写,但使用这种转换方法无法进行操作。 例如,如果我通过加密传递“hello”,我的加密字符串
我已经创建了一组算法,它接受一个字符串 vector 的输入,检查是否有任何字符串出现不止一次:如果是这样,从 vector 中删除所有额外出现的字符串,然后输出新的,'lighter ' 没有冗余的
我实现了 toUpper()。它并非 100% 有效。 代码: char* toUpper(char* string) { char* sv = string; while(*sv++
我很好奇 .ToUpper() 是如何工作的?是否存在某种映射,较低的 a 具有 UTF 代码 XYZ,而较高的 a 具有 UTF 代码 XYZ1? 最佳答案 是的,它正在使用 Unicode 元数据
我有一个 []byte,b,我想选择一个字节,b[pos] 并改变它大写(然后是小写) bytes 类型有一个名为 ToUpper() 的方法。如何将它用于单个字节? 在单个字节上调用 ToUpper
我在使用 toupper() 函数时遇到问题: 代码: #include #include using namespace std; int main (){ string input {
如果 ToUpper() 不存在,你会怎么写? i18n 和 L10n 的奖励积分 由此引发的好奇心:http://thedailywtf.com/Articles/The-Long-Way-toUp
我见过以下使用自定义 toupper() 函数的程序。 #include void my_toUpper(char* str, int index) { *(str + index) &=
长期潜伏者需要帮助,但我无法通过搜索找到。好吧,我在撒谎,我发现了一些东西,但它对我没有帮助。 我想做的是创建一个包含字符串的 char 数组并显示,将它们传递给一个函数,该函数将大写字母字符(应该只
我被分配重新编码 toUpper 和 toLower 函数。我是否必须在 if 语句中写出所有 26 个字母,例如: if ( char == 'a' ) return 'A'; 或者还有其他简单的方
我是一名优秀的程序员,十分优秀!