【问题标题】:Why is my code output incorrect (i only want to receive integers as key)?为什么我的代码输出不正确(我只想接收整数作为键)?
【发布时间】:2020-06-27 09:11:34
【问题描述】:

为什么我的代码输出不正确(我只想接收整数作为键)?

在下面的代码中,我试图对计算机说的是'只接受 int's 作为密钥,否则拒绝密钥'

int main(int argc, string argv[])                           //command line argument
{

  for ( int i = 0; i< strlen(argv[1]); i++)
  {
  if (argc != 2)                                            //correct argument count
  {
    printf ("usage: ./caesar key\n");
    return 1;
  }
  else if(isdigit(argv[1][i]))
  {
     printf("success\n");
  }
  else if(isalpha(argv[1][i]))
  {
    printf ("usage: ./caesar key\n");
    return 1;
  }
}  

但是,当我尝试不同的输入来测试我的代码的准确性时,发生了以下情况:

~/caesar/ $ ./caesar 4r       //<--mix of outputs.i don't want 'success' here bc input has a letter
success
usage: ./caesar key
~/caesar/ $ ./caesar g5       //correct output
usage: ./caesar key
~/caesar/ $ ./caesar r        //correct output
usage: ./caesar key

如你所见,当我输入一个字母然后一个int,它工作正常,但是当我做相反的事情(int 然后是字母),它会给我一个混合输出,拒绝和接受输出。

【问题讨论】:

    标签: c if-statement output command-line-arguments cs50


    【解决方案1】:

    您的问题来了,因为虽然第一个字符是您为每个字符打印“成功”的数字,但您必须等待检查所有字符才能确定您成功

    注意事项

    if (argc != 2)                                            //correct argument count
    {
      printf ("usage: ./caesar key\n");
      return 1;
    }
    

    循环内没用,移到循环前

    strlen(argv[1]) 每一回合都是昂贵的

    你想要这样的东西:

    int main(int argc, string argv[])                           //command line argument
    {
      if (argc != 2)
      {
        printf ("usage: %s key\n", *argv);
        return 1;
      }
    
      for (int i = 0; argv[1][i] != 0; i++)
      {
        if(!isdigit(argv[1][i]))
        {
          printf ("usage: %s key\n", *argv); // better to say the key is not an integer
          return 1;
        }
      }  
    
      puts("success");
      return 0;
    }
    

    我想一个负整数被拒绝并且接受整数的大小没有限制(int 可能因为溢出而不够用)

    编译和执行:

    pi@raspberrypi:/tmp $ gcc -Dstring="char*" -Wall c.c
    pi@raspberrypi:/tmp $ ./a.out 123
    success
    pi@raspberrypi:/tmp $ ./a.out 1a
    usage: ./a.out key
    pi@raspberrypi:/tmp $ ./a.out a1
    usage: ./a.out key
    pi@raspberrypi:/tmp $ ./a.out ""
    success
    

    如果参数为空,必须做什么?目前它是成功的,但可能它一定不是,所以一种方法是替换

     if (argc != 2)
    

    通过

     if ((argc != 2) || !argv[1][0])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      相关资源
      最近更新 更多