在凯撒(Pset2)上遇到“分段错误”

时间:2020-10-18 16:01:17

标签: cs50 caesar-cipher

这是我的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;
}

谢谢。

1 个答案:

答案 0 :(得分:0)

似乎有很多错误。

首先,让我们承认房间里的大象-

if (argc == 2 && is_numerical(argv[1] == true))

这将检查当参数为argcis_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进行编译,以在编译过程中捕获这些错误。