C++ for 循环逻辑 : break after getting strings from cmdline arguments?

标签 c++ for-loop

在许多人的帮助下,我一直在编写一个程序,将 Windows 剪贴板的内容写入文本文件。 (我正在 Visual Studio 2010 中工作。)我一直在尝试找出 for 循环的逻辑,该循环将测试命令行参数(如果有);参数可以是

a codepage number
a filename or path 

或两者,以任意顺序。如果未指定代码页(或者用户指定了无效的代码页),则程序将使用默认的 Windows 代码页(通常为 1252)。如果未指定文件名,程序会将输出写入“#clip.txt”。

我知道我阅读论点的方法效率低下,但这是我现在能想到的最好的方法。我使用两个 for 循环。首先检查每个命令行参数;如果字符串不是全数字,则使用该字符串作为文件名,然后中断。下一个循环再次检查每个参数,如果字符串是全数字,则将其指定为代码页编号,然后中断。

这个想法是,如果用户输入

clipwrite 500 850

只有第一个 (500) 应该用作代码页。如果用户输入

clipwrite foo.txt bar.txt

输出应写入 foo.txt。

如果用户不输入任何参数、仅输入一个参数或输入一个数字和一个字母字符串,我的代码似乎可以正常工作。但我显然做错了什么,因为如果用户输入

clipwrite 500 850

然后使用 850(应该忽略它)。如果用户输入

clipwrite foo.txt bar.txt

程序崩溃了。谁能帮我解决一下我的逻辑有问题吗?以下是相关代码(使用命令行解析例程来获取 argc 和 argv):

if (argc > 1) {
    // get name of output file if specified
    for ( i = 1; i < argc; i++ ) {
        if (i < 3) {
            string argstr = argv[i];
            //if string is not digits-only, use as filename
            for (size_t n = 0; n <argstr.length(); n++) {
                if (!isdigit( argstr[ n ]) ) {
                    OutFile = argv[i];
                    break;
                } 
            }
        }
    }
    // get codepage number if specified
    for ( i = 1; i < argc; i++ ) {
        if (i < 3) {
            string argstr = argv[i];
            for (size_t n = 0; n <argstr.length(); n++) {
                if (!isdigit( argstr[ n ]) ) {
                // if all chars are digits
                } else {
                    // convert codepage string to integer
                    int cpint = atoi(argstr.c_str()); 
                    // check if codepage is valid; if so use it
                    if (IsValidCodePage(cpint)) {
                        codepage = "."+argstr;
                    }
                    break;
                }
            }
        }
    }
}       

非常感谢您对这个初级问题的帮助。

最佳答案

也许是这样的:

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
#include <cstdlib>

int main(int, char **argv) {
    std::string filename = "#clip.txt";
    int codepage = 1252;
    bool bFilenameSet = false;
    bool bCodepageSet = false;

    for (++argv; *argv; ++argv) { // *argv == NULL at end of arguments
        char *p = *argv;
        for ( ; *p; ++p)
            if (!isdigit(*p))
                break;
        if (*p) {  // non-digit found
            if (!bFilenameSet) {
                filename = *argv;
                bFilenameSet = true;
            }
        }
        else {
            if (!bCodepageSet) {
                codepage = atoi(*argv);
                bCodepageSet = true;
            }
        }
    }

    std::cout<< "Filename: "<< filename<< "\n";
    std::cout<< "Codepage: "<< codepage<< "\n";

    return 0;
}

关于C++ for 循环逻辑 : break after getting strings from cmdline arguments?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214759/

相关文章:

C++ - 连续检查 3

python - 在 Python 中嵌套 for 循环的替代方法

java - 尝试创建使用两个用户输入值的嵌套 for 循环

c++ - CombineRgn 函数后白色闪烁

c++ - Apple clang 编译器版本控制架构?

C++ 模板和继承

c++ - sqlite select 语句抛出的异常

python - 如何从嵌套列表中删除项目

python - 如何更改for循环的索引?

Java - 每次运行 for 循环时缩进该行