c++ - 在 C++ 中检查命令行输入是否有错误

标签 c++ command-line-arguments

我刚才让这个程序工作,但改变了一些东西,现在我的错误处理变得疯狂了。我几乎是在用头撞墙,试图将其恢复原状,但无论我现在做什么,它都会报错。​​

该程序应该采用命令行参数来定义行和列,并基于此创建动态二维数组。格式为“-行(数字)-列(数字)”。我试图在交作业之前再添加几个案例,但我一定是在其他地方更改了一些逻辑,因为即使我删除了新部分,无论我输入什么,它仍然无法工作。在这一点上,我想我只需要一双新鲜的眼睛来指引我正确的方向。

int main(int argc, char* argv[]) {

// Checks if the user input the correct number of arguments.
// If so, checks if they were input corecctly. If so, it assigns
// the user input values to rows/columns, and if not, prints
// an error message.
     if(argc == 5) {
            for(int i = 1; i < argc; i++) {
                    rows = getArg(argc, argv, i, compare1);
            }
            for(int i = 1; i < argc; i++) {
                    columns = getArg(argc, argv, i, compare2);
            }
    } else {
           printError(argv);
    }

这是main的相关部分。

以下是检查错误所涉及的函数。我实际上一直在研究的是 getArg,所以我假设这是逻辑失败的地方,但为了清楚起见,我包括了其他必要的函数。

// Description: Checks if user input was valid
// Parameters: Command line arguments, int i from the for
// loop used to run this check on all command line arguments
// in main, and an array of chars used to compare the user's
// inputs to "-rows" or "-columns"
// Return value: If user input was valid, returns an int
// If not, exits program.

int getArg(int argc, char* argv[], int i, char compare[]) {

    int arg;
    if (strcmp(argv[i], compare) == 0) {
           if (isInt((i + 1), argv)) {
                    arg = atoi(argv[i + 1]);
            } else {
                    printError(argv);
            }
    } else {
            printError(argv);
    }

    return arg;
}

// Description: Checks user input for valid integers
// Parameters: Command line arguments
// Return value: Returns true if input is an int;
// false if not.

bool isInt(int argc, char* argv[]) {
    bool isInt;

    for (int j = 0; j < strlen(argv[argc]); j++) {  //For loop runs through each char in the array at argc
            if (isdigit(argv[argc][j])) {   // Checks to see if char is an integer
                    isInt = true;
                    return isInt;
            } else {
                    isInt = false; // If there is ever a non-integer character, exit loop and return false
                    return isInt;
            }
    }

最佳答案

main 中的第一个 for 循环在匹配“-rows”后继续扫描参数列表。该循环进行以下调用(我假设这里是 compare1="-rows"因为你没有提到它):

i=1: getArg(argc=5, argv={"a.out", "-rows", "2", "-columns", "3"}, i=1, compare="-rows") 
    returns 2
i=2: getArg(argc=5, argv={"a.out", "-rows", "2", "-columns", "3"}, i=2, compare="-rows")
    calls printError(argv) because strcmp("2", "-rows") is nonzero

此外,正如 Abhishek 提到的,isInt 只检查字符串的第一个字符,因为您在 isInt = true 分支中返回。

关于c++ - 在 C++ 中检查命令行输入是否有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163120/

相关文章:

c++ - ClearCase 描述未按预期工作

c++ - 我如何仅使用 Binder 在 map 中找到值

python - 在 Windows 中将希伯来语文件名作为命令行参数传递

makefile 的命令行参数

c++ - 使用 "delete this"删除当前对象是否可以?

c++ - 永久关闭 VS2010 ( C/C++ ) 的大纲

bash - 如何将带有管道符号的多个参数传递到 bash 脚本 case 语句中

python - 在多个自定义模块支持的多个脚本中使用 python 的 argparse

C++ Doxygen 隐藏注释

c - 当两个路径都有空格时,如何使用 C 程序中的文件启动外部程序?