0

说我的命令行是a.out -a 3eF6

如果我访问 argv[2],它将给我 3eF6(我认为这是一个字符数组?)我将如何循环检查每个字符是否是整数,而不是像“e”这样的 alpha 值还是“F”?

我如何/将它变成一个字符串?

我知道如果我这样做a = atoi(argv[2])argv[2]32 在哪里,那么 a = 32。我也知道如果argv[2]是 3eF6,那么以下不会导致“错误输入”。

 a = 0;
 a = atoi(argv[2])
if( a = 0 )
 cout << "wrong input";

相反,a将被评估为 3。因此它仅读取此实例中的第一个整数,但我希望能够访问整个参数 3eF6。

我尝试过使用 atoi(getline(argv[2], a) 或类似的东西,但由于某种原因,我收到一个错误,提示我无法将字符串转换为 const char。

无论如何,我如何将 argv[2] 转换为我可以解析的字符串?或者我如何访问 argv[2] 中的每个字符?

我也试过:

string string1 = argv[i+1] // argv[i] is an option like -a

但是在使用参数运行程序时,我收到此错误:

./a.out -b 2 -a 2 -s 2 -t 8

在抛出 'std::logic_error' what() 的实例后调用终止:basic_string::_S_construct NULL not valid Abort (core dumped)

4

2 回答 2

1
TCHAR c;
int n(0);
int x(0);
int y(0);

for (x = 0; x < argc; ++x)
{
    // Loop through each character in the argument.
    n = _tcslen(argv[x]);
    for (y = 0; y < n; ++y)
    {
        c = argv[x][y];
        if (isdigit(c))
        {
            cout << c << "is a digit" << endl;
        }
        else
        {
            cout << c << "is not a digit" << endl;
        }
    }
}
于 2013-03-03T04:46:56.120 回答
1

最后,我创建了一个 char 指针来保存我的 char 命令行元素:

char* charString = argv[i+1];

并将其传递给函数进行解析

parser(charString);

在这种情况下, argv[i+1] 相当于我的问题中的 argv[2] 。我的解析器函数的函数定义如下所示:

    void parser(char* charString){
        for(int i=0; charString[i] != '\0'; i++){
                bool isAlpha = isalpha(charString[i]);
                bool isPunct = ispunct(charString[i]);
                if ((isAlpha == true)||(isPunct == true)){
                        printError();
                        exit(1);
                } else;
           }
     }

需要注意的重要一点是,要在 char 数组的末尾结束解析,您不能这样做

for(int i=0; charString[i] < sizeof(charString); i++){

因为数组大小将始终返回 8 或 9。相反,您必须在评估的字符等于 '\0' 时结束解析,或者换句话说,在字符 charString[i] 不等于 '\0' 时进行解析。

于 2013-03-03T22:27:28.777 回答