проблемы с исполняемым файлом C ++ - PullRequest
0 голосов
/ 23 июня 2010

У меня есть сгенерированный C ++ исполняемый файл в Solaris 8. У меня проблема в том, что этот исполняемый файл использует для запуска параметр командной строки.

Например:

$ myprog 123412341234AB 

Этодействительное 14-значное шестнадцатеричное значение.Однако, если по какой-либо причине существуют такие символы, как ^ > < >> << & и т. Д., Программа сама по себе не работает должным образом.Я не говорю о дампах ядра как таковых, но, например, одна из проверок, которые я делаю, - через isxdigit.По-видимому, недостаточно ловить что-то вроде 1234123412341^ или 12341234(12341, поэтому я просто пытаюсь понять, смогу ли я обнаружить все эти символы в попытке просто правильно выйти.Я имею в виду, что некоторые из этих символов имеют особое значение в Unix, и я думаю, именно поэтому программа не понимает, как с этим обращаться.

Есть ли у вас мысли о том, как решить эту проблему?Я просто пытаюсь найти все эти символы, и как только я обнаруживаю их в команде, я просто выхожу с сообщением об ошибке?Как бы я поступил так?

Я использую std::string.Так что, может быть, список типа !@#$%^&*()<><<>> и т. Д., Где я могу обнаружить и выйти.Я не уверен, есть ли более простой способ сделать это, поэтому Unix не думает, что я даю ему системную команду, хотя на самом деле это просто ввод в программу, хотя это просто неверный / недействительный ввод.

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

Вы не можете исправить это, изменив вашу программу - эти специальные символы интерпретируются оболочкой до того, как ваш код их когда-либо увидит.

Вы можете предотвратить это, заключив аргумент командной строки в одинарные кавычки:

myprog 'some_string_<with_special&>!chars'

или экранируя специальные символы (предваряя каждый обратным слешем):

myprog some_string_\<with_special\&\>\!chars
0 голосов
/ 23 июня 2010

Эти символы являются специальными для командной оболочки и удаляются еще до запуска вашей программы.Читайте о цитировании или экранировании специальных символов для вашей оболочки.

0 голосов
/ 23 июня 2010

Просто для решения одной части вопроса вы могли бы сделать функцию 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...