cs50 - pset 2 - 替换程序
cs50 - pset 2 - substitution program
我正在执行 cs50 pset 2 - 替换,我们必须使用用户在命令行中提供的密钥加密明文,但以下代码没有提示输入.我究竟做错了什么?任何帮助将不胜感激!
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int check(int c, string key);
int main(int argc, string argv[])
{
int checkR = check(argc, argv[1]);
if(checkR == 1)
{
return 1;
}
else
{
string key = argv[1];
string ptext = get_string("plaintext: ");
int len = strlen(ptext);
char ctext[len];
for (int i = 0; i < len; i++)
{
if(isupper(ptext[i]))
ctext[i] = toupper(key[(int)ptext[i] - 65]);
else if(islower(ptext[i]))
ctext[i] = tolower(key[(int)ptext[i] - 97]);
else
ctext[i] = ptext[i];
}
printf("ciphertext: %s\n", ctext);
return 0;
}
}
int check(int c, string key)
{
int keyL = strlen(key);
if(c != 2)
return 1;
else if(keyL != 26)
return 1;
for(int i = 0; i < keyL - 1; i++)
{
for(int j = i; j < keyL; j++)
{
if(key[i] == key[j])
return 1;
}
}
return 0;
}
问题的答案
在 check
函数中,您将内部循环初始化为 int j = i
。
因此,在第一次迭代中,key[i] == key[j]
将始终为真。
然后,1
从 check
返回,它阻止 main
函数打印提示。
初始化应该是int j = i + 1
.
其他错误
首先,在检查c
之前做int keyL = strlen(key);
是不好的,因为key
(argv[1]
)当c
时可能是NULL
(argc
) 小于 2
.
其次,此代码中的printf("ciphertext: %s\n", ctext);
将调用未定义的行为,因为ctext
中存储的不是NUL-terminated。
char ctext[len];
应该是 char ctext[len+1];
并且 ctext[len]='[=29=]';
应该在 printf("ciphertext: %s\n", ctext);
之前添加。
我正在执行 cs50 pset 2 - 替换,我们必须使用用户在命令行中提供的密钥加密明文,但以下代码没有提示输入.我究竟做错了什么?任何帮助将不胜感激!
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
int check(int c, string key);
int main(int argc, string argv[])
{
int checkR = check(argc, argv[1]);
if(checkR == 1)
{
return 1;
}
else
{
string key = argv[1];
string ptext = get_string("plaintext: ");
int len = strlen(ptext);
char ctext[len];
for (int i = 0; i < len; i++)
{
if(isupper(ptext[i]))
ctext[i] = toupper(key[(int)ptext[i] - 65]);
else if(islower(ptext[i]))
ctext[i] = tolower(key[(int)ptext[i] - 97]);
else
ctext[i] = ptext[i];
}
printf("ciphertext: %s\n", ctext);
return 0;
}
}
int check(int c, string key)
{
int keyL = strlen(key);
if(c != 2)
return 1;
else if(keyL != 26)
return 1;
for(int i = 0; i < keyL - 1; i++)
{
for(int j = i; j < keyL; j++)
{
if(key[i] == key[j])
return 1;
}
}
return 0;
}
问题的答案
在 check
函数中,您将内部循环初始化为 int j = i
。
因此,在第一次迭代中,key[i] == key[j]
将始终为真。
然后,1
从 check
返回,它阻止 main
函数打印提示。
初始化应该是int j = i + 1
.
其他错误
首先,在检查c
之前做int keyL = strlen(key);
是不好的,因为key
(argv[1]
)当c
时可能是NULL
(argc
) 小于 2
.
其次,此代码中的printf("ciphertext: %s\n", ctext);
将调用未定义的行为,因为ctext
中存储的不是NUL-terminated。
char ctext[len];
应该是 char ctext[len+1];
并且 ctext[len]='[=29=]';
应该在 printf("ciphertext: %s\n", ctext);
之前添加。