【问题标题】:Checking if argv[i] is a valid integer, passing arguments in main检查 argv[i] 是否为有效整数,在 main 中传递参数
【发布时间】:2013-10-22 17:19:07
【问题描述】:

我正在尝试确保传递给 main 的所有参数都是有效的整数,如果不是,我将打印一个错误。例如,如果我有一个名为 total 的可执行文件,我将输入 total 1 2 3 4。 如果存在无效整数,我想打印一个错误,所以如果我输入total 1 2 3zy,它将打印一条错误消息。我的代码如下。

#include <iostream>
#include<stdlib.h>
using namespace std;

bool legal_int(char *str);

int main(int argc, char *argv[])
{
 //int total = 0;
 for(int i = 1; i < argc; i++)
 {
  if( (legal_int(argv[i]) == true) )
  {
   cout << "Good to go" << endl;
  }
  else
  {
   cerr << "Error: illegal integer." << endl;
   return 1;
  }
 }

  // int value = atoi(argv[i]);
  //cout << value << endl;
}

bool legal_int(char *str)
{
 while(str != 0) // need to
 if( (isdigit(str)) )// do something here
 {
  return true;
 }
 else
 {
  return false;
 }
}

我需要知道的是如何通过legal_int 函数对字符串中的所有字符进行索引并确保它们是数字?

【问题讨论】:

    标签: c++ function argv argc


    【解决方案1】:

    比较每个字符时,逻辑应该是如果不合法,返回false,否则继续:

    bool legal_int(char *str)
    {
        while (str != 0)
        {
            if (!isdigit(*str)) 
            {
               return false;
            }
            str++;
        }
        return true;
    }
    

    【讨论】:

      【解决方案2】:

      怎么样:

      bool legal_int(char *str) {
          while (*str)
              if (!isdigit(*str++))
                  return false;
          return true;
      }
      

      这不是最好的功能,但它应该服务于目的。 isdigit 函数需要一个字符来查看,所以传入*str。另一个关键点是你需要在循环内部推进指针。

      【讨论】:

        【解决方案3】:
        bool legal_int(char *str)
        {
         while(str != 0) // need to
         if( (isdigit(str)) )// do something here
         {
          return true;
         }
         else
         {
          return false;
         }
        }
        

        你犯了三个错误:

        1. while (str != 0) 应该是 while (*str != 0)。你想继续直到你在字符串中遇到一个零,而不是直到字符串本身消失。

        2. if( (isdigit(str)) ) 应该是if( (isdigit(*str++)) )。你想看看str指向什么,看看是不是一个数字,你需要指向下一个数字。

        3. return true; 那不应该在那里。您不想仅仅因为找到一个数字就返回。

        【讨论】:

          猜你喜欢
          • 2013-03-06
          • 2012-11-16
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 2012-10-22
          • 2018-03-13
          • 2018-10-17
          相关资源
          最近更新 更多