这是我的cs50的Ceasar(pset2)代码。
我能够编译我的程序。
但是,在尝试执行它时,出现了段错误。另外,在使用调试器时,没有出现段错误,但是在显示密文之前出现了^ D。像这样:
明文:HELLO 密文:^ DIFMMP
您能指出问题出在哪里吗?
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
bool is_numerical(string e);
int main(int argc, string argv [])
{
if (argc == 2 && is_numerical(argv[1] == true))
{
string t = argv [1];
int k = atoi ( t );
string s = get_string ("plaintext: ");
printf ("ciphertext:" );
for (int i = 0, n = strlen(s); i < n; i++)
{
char c = s[i];
if (isalpha (c))
{
if (isupper(c))
{
int x = ((int) c - 65 + k) % 26 + 65;
printf ("%c", (char) x);
}
else
{
int x = ((int) c - 97 + k) % 26 + 97;
printf ("%c", (char) x);
}
}
else
{
printf ("%c", c);
}
}
printf ("\n");
return 0;
}
else
{
printf("Usage: ./caesar key \n");
return 1;
};
}
bool is_numerical(string e)
{
for (int i = 0, n = strlen(e); i < n; i++)
{
if (!isalnum (e))
return false;
}
return true;
}
谢谢。
答案 0 :(得分:0)
似乎有很多错误。
首先,让我们承认房间里的大象-
if (argc == 2 && is_numerical(argv[1] == true))
这将检查当参数为argc
时is_numerical
是否等于2 ,并且是否argv[1] == true
返回true,argv[1]
将当true
等于2时为argc
。因此,实际上,您每次都将一个整数值传递给is_numerical
,值是1-但它期望的值是char*
或string
。
您可能打算做is_numerical(argv[1]) == true
。也就是说,将argv[1]
传递到is_numerical
并将返回值与true
进行比较。您也可以完全省略真实部分,因为这在布尔表达式中是多余的。
if (argc == 2 && is_numerical(argv[1]))
现在,您在is_numerical
函数中犯了致命错误。
if (!isalnum(e))
isalnum
的类型值为char
(实际上是int
,但是char
仍将得到提升)。您正在将e
传递给它。猜猜e
是什么类型,string
还是char*
。您是否不应该传递字符串的每个字符,所以e[i]
在该循环内?
if (!isalnum(e[i]))
您的代码中可能还有更多的算法问题,这些问题不是立即可见的。但是is_numerical
的致命错误是分割错误背后的原因。
建议语,始终使用-Wall
进行编译,以在编译过程中捕获这些错误。