在许多人的帮助下,我一直在编写一个程序,将 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/