【问题标题】:C++ add checks to avoid reading two argumentsC++ 添加检查以避免读取两个参数
【发布时间】:2019-08-16 17:29:23
【问题描述】:

我的代码当前读取两个参数,如果有人输入一个数字,例如 100,我需要添加一个检查以读取 1 个参数,如果输入 100 3,则读取第二个参数。 现在它每次都读取两个参数,如果输入一个参数,就会出错。

#include <iostream>
#include <cstring>

using namespace std;
int perfectnumber(int number)
{

   int sumofdivisor = 0;
   for (int i = 1; i < number; i++)
   {
       if (number % i == 0)  
       sumofdivisor += i;
   }

   return abs(sumofdivisor - number);
}

int main(int argc, char *argv[])
{
   int count = atoi(argv[2]); 
   int upper_limit = atoi(argv[1]);

   for (int start = 2; start <= upper_limit; start++)
    {
        int difference = perfectnumber(start);
        if (difference <= count)
        {
            cout << start << " ";
        }  
    }
    cout << endl;
}

【问题讨论】:

  • 只检查 argc: int count = argc > 2 ? atoi(argv[2]) : 0; // 应该这样做
  • 具体需要在哪里添加?
  • @B.smith 您似乎很难使用 argc 提供的信息。当只给出一个论点时,让我知道你想要发生什么。你的程序应该做什么?警告并退出?猜测第二个参数,基于默认值?我可以扩展我的答案。

标签: c++ if-statement perfect-numbers


【解决方案1】:

参数argc是你的朋友,它告诉你有多少个参数。

这是一个如何使用 argc 的示例。

#include "stdio.h"
int main(int argc, char* argv[])
{

    printf("Number: %d\n", argc);
    printf("0: %s\n", argv[0]);
    if (1<argc)
    {
        printf("1: %s\n", argv[1]);
    }
}

【讨论】:

  • @Scheff 这不仅仅是链接,第一个版本是免费的并且足够好,但我认为 OP 在实际使用它时需要一些帮助,因为有评论。我在链接(非外部)和再次在这里复制相同的东西之间摇摆不定。而且我不希望删除其他答案(或问题),它太旧了。但是好的,有了你的反馈,我会去复制。
【解决方案2】:

您可以使用argc 查看提供了多少参数。第一个参数是可执行文件的名称1,因此您必须与3 进行比较。这是一个简单的例子:

#include <iostream>
#include <cstdlib>


int main(int argc, char *argv[])
{
  if (argc < 3) {
    std::cerr << "Too few arguments\n";
    return EXIT_FAILURE;
  }
  std::cout << "Args: " << argv[1] << " and " << argv[2] << '\n';
}

1 这并不完全正确。根据this 参考:“argv[0] 是指向以空字符结尾的多字节字符串的初始字符的指针,它表示用于调用程序本身的名称(如果不支持,则为空字符串""执行环境)。”但正如a comment 指出的那样,这也不完全准确。这是实现通常遵循但可以不遵循的约定。

【讨论】:

  • 第一个参数是可执行文件的名称:这实际上只是一个约定:exec (3)按照约定,第一个参数应该指向与正在执行的文件关联的文件名。 _exec, _wexec Functions此参数是新进程的argv[0]。通常,此参数是 cmdname 的副本。 (不同的值不会产生错误。) 但是,不遵循该约定可能就像在自己的脚上开枪一样。 ;-)
  • @Scheff 感谢您的反馈!在答案中添加了指向此更完整说明的链接。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2016-11-11
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多