gpt4 book ai didi

CS50 CAESAR - 根据语句位置不同的输出,但我不明白为什么

转载 作者:行者123 更新时间:2023-11-30 20:28:37 25 4
gpt4 key购买 nike

在下面的代码中,根据放置 'Printf("Ciphertext: )' 语句的位置,我得到不同的输出,我无法理解为什么。有人可以指出我缺少什么吗?下面你可以找到代码,以及输出(粗体变量部分)。

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


int main(int argc, string argv[])
{
int j = strlen(argv[1]);
if (argc != 2)
{
printf ("Usage: ./caesar key\n");
return (1);
}

else
{

for (int i = 0; i < j; i++)
{
if (!isdigit (argv[1][i]))
{
printf ("Fail\n");
return(1);
}
}

int convert = atoi (argv[1]) ;


string Plaintext = get_string("Plaintext: ");
int z = strlen(Plaintext);
**printf("Ciphertext: ");**

for (int i = 0; i<z;i++)
{
char Ciphertext [z];
Ciphertext [i] = (Plaintext [i] + 1);
}


for (int i = 0; i<z;i++)
{
char Ciphertext [z];
printf("%c", Ciphertext [i]);
}
printf("\n");




}



}

如果我使用此代码运行 ./caesar,并在明文提示中输入“Hey”,则输出为密文:ifz,我对此感到满意。但是,当我将 printf("Ciphertext: ") 语句放置到对我来说更符合逻辑的地方时,我没有得到相同的输出:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


int main(int argc, string argv[])
{
int j = strlen(argv[1]);
if (argc != 2)
{
printf ("Usage: ./caesar key\n");
return (1);
}

else
{

for (int i = 0; i < j; i++)
{
if (!isdigit (argv[1][i]))
{
printf ("Fail\n");
return(1);
}
}

int convert = atoi (argv[1]) ;


string Plaintext = get_string("Plaintext: ");
int z = strlen(Plaintext);


for (int i = 0; i<z;i++)
{
char Ciphertext [z];
Ciphertext [i] = (Plaintext [i] + 1);
}

**printf("Ciphertext: ");**


for (int i = 0; i<z;i++)
{
char Ciphertext [z];
printf("%c", Ciphertext [i]);
}
printf("\n");




}



}

当我在这里执行完全相同的操作时,我打印 Ciphertext: 和一个空行,但它不会打印出上面的密文 [] 。有任何想法吗?

最佳答案

正如 usr2564301 所指出的在 comment ,您需要声明一次Ciphertext,这样它就不会超出范围。当它超出范围时,旧值将正式丢失 - 您可能会也可能不会再次看到它(因为访问未初始化的内存是未定义的行为,因此任何结果都是有效的)。

请注意,虽然您将 argv[1] 转换为整数,但您并不使用结果。编码中的 + 1 意味着您始终将 1 提供为 argv[1]。您的代码不会进行环绕操作,因此 z 会映射到 a。它也不能正确处理大写和小写。您可能也不应该尝试对非字母进行编码。然而,对代码的这种相当直接的修改至少会产生类似的结果:

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
//#include <stdlib.h> // Needed if atoi() is called
#include <string.h>

int main(int argc, string argv[])
{
// This checking is not relevant while the encryption only adds 1
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return(1);
}
int j = strlen(argv[1]);
for (int i = 0; i < j; i++)
{
if (!isdigit(argv[1][i]))
{
printf("Fail\n");
return(1);
}
}
// int convert = atoi(argv[1]);

string Plaintext = get_string("Plaintext: ");
int z = strlen(Plaintext);
char Ciphertext[z];

for (int i = 0; i < z; i++)
{
Ciphertext[i] = (Plaintext[i] + 1); // Should use convert, etc
}

printf("Ciphertext: ");

for (int i = 0; i < z; i++)
{
printf("%c", Ciphertext[i]);
}
printf("\n");
return 0;
}

示例运行(从源代码 cs79.c 创建的程序 cs79):

$ cs79 13
Plaintext: Bright vixens jump; dozy fowl quack.
Ciphertext: Csjhiu!wjyfot!kvnq<!ep{z!gpxm!rvbdl/
$

关于CS50 CAESAR - 根据语句位置不同的输出,但我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60111098/

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