C ++可执行文件的问题

时间:2010-06-23 17:20:22

标签: c++ validation

我在Solaris 8中生成了一个C ++生成的可执行文件。我遇到的问题是这个可执行文件使用命令行参数来运行。

例如:

$ myprog 123412341234AB 

这是一个有效的14位十六进制值。但是,如果由于某种原因存在^ > < >> << &等符号,则程序本身的行为不正确。我不是在谈论核心转储本身 例如,我做的一项检查是通过isxdigit。显然它不足以捕获 像1234123412341^12341234(12341这样的东西,所以我只是想看看我是否可以检测所有这些符号以便正确退出。我的意思是,这些符号中的一些在Unix中具有特殊含义,我想这就是为什么程序不理解如何处理它。

您对如何解决这个问题有什么想法吗?我是否只是尝试找到所有这些符号以及在命令中检测到它们的那一刻,我只是退出并显示错误消息? 我该怎么做呢?

我正在使用std::string。所以也许像!@#$%^&*()<><<>>等列表,我可以检测并离开。我不确定是否有一种更简单的方法可以做到这一点,所以Unix不认为我给它一个系统命令,实际上它只是一个程序的输入,虽然它恰好是一个错误/无效的输入。 / p>

3 个答案:

答案 0 :(得分:3)

您无法通过修改程序来修复此问题 - 这些特殊字符正在存在 在您的代码看到之前由shell解释。

您可以通过单引号命令行参数来阻止这种情况:

myprog 'some_string_<with_special&>!chars'

或通过转义特殊字符(在每个字符前加一个反斜杠):

myprog some_string_\<with_special\&\>\!chars

答案 1 :(得分:0)

只是为了解决问题的一部分,你可以像这样制作一个“isxstring”函数:

bool isxstring(const std::string &s) {
    for(std::string::const_iterator it = s.begin(); it != s.end(); ++it) {
        if(!isxdigit(*it)) {
            return false;
        }
    }
    return true;
}

如果你没有做至少与此类似的事情,那么你没有正确检查每个字符是否是十六进制数字。

这也可能是一个有效的定义:

bool isxstring(const std::string &s) {
    return s.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos;
}

答案 2 :(得分:0)

这些字符对于命令shell是特殊的,并且在程序启动之前被删除。阅读引用或转义shell的特殊字符。