bool stringMatch(const char *expr, const char *str) {
// do something to compare *(expr+i) == '\\'
// In this case it is comparing against a backslash
// i is some integer
}
int main() {
string a = "a\\sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
C и C ++ обрабатывают обратную косую черту как escape-последовательности по умолчанию. Вы должны сказать C, чтобы не использовать вашу обратную косую черту как escape-последовательность, добавляя дополнительную обратную косую черту к вашей строке.
Это общие escape-последовательности:
EDIT: Xcode ведет себя ненормально на вашей машине. Поэтому я могу предложить вам это .
bool stringMatch(const char *expr, const char *str) {
// do something to compare *(expr+i) == '\\'
// In this case it is comparing against a backslash
// i is some integer
}
int main() {
string a = "a" "\x5C" "sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
Не беспокойтесь о пробелах в объявлении string a
, Xcode объединяет строки, разделенные пробелом.
EDIT 2: Действительно, Xcode читает ваш "a\\b"
в буквальном смысле, это то, как он имеет дело с экранированными обратными косыми чертами. Когда вы выведете string a = "a\\sb"
на консоль, вы увидите a\sb
. Но когда вы передадите string a
между методами в качестве аргумента или как частный член, тогда это займет дополнительный обратный слэш lite ралли. Вы должны разработать свой код с учетом этого факта, чтобы он игнорировал дополнительную обратную косую черту.
РЕДАКТИРОВАТЬ 3: Edit 1
- ваш оптимальный ответ здесь, но вот еще один.
Добавить код в ваш метод stringMatch()
для замены двойная обратная косая черта с одиночной обратной косой чертой.
Вам просто нужно добавить эту дополнительную строку в самом начале функции:
expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];
Это должно решить проблему двойной обратной косой черты.
РЕДАКТИРОВАТЬ 4: Некоторые люди считают, что Edit 3 является ObjectiveC и, следовательно, не является оптимальным, поэтому другой вариант в ObjectiveC ++.
void searchAndReplace(std::string& value, std::string const& search,std::string const& replace)
{
std::string::size_type next;
for(next = value.find(search); // Try and find the first match
next != std::string::npos; // next is npos if nothing was found
next = value.find(search,next) // search for the next match starting after
// the last match that was found.
)
{
// Inside the loop. So we found a match.
value.replace(next,search.length(),replace); // Do the replacement.
next += replace.length(); // Move to just after the replace
// This is the point were we start
// the next search from.
}
}
РЕДАКТИРОВАТЬ 5: Если вы измените const char *
в stringMatch()
для «string» он будет менее сложным для вас.
expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str );
PS Теперь у вас есть все ответы, поэтому вам нужно, что вы реализуете, что дает вам наилучшие результаты.
Это предполагаемое поведение на стороне веб-браузера - отключенный элемент управления не будет отправлять свои данные на сервер при отправке формы.
Вы можете подделать это, поместив на страницу скрытое поле со значением - только не забудьте проверить данные. Или использовать javascript для включения поля до того, как произойдет действие отправки.
Если вы отключаете поле, но при этом показываете его на странице с некоторым значением, то должен быть способ узнать это значение, не отправляя его обратно из браузера на сервер.
Добавьте событие изменения с помощью JavaScript:
$ ('# dropdown'). Change (function (e) {e.preventDefault ();});
Создайте раскрывающийся список, содержащий только 1 элемент. .
Вы можете включить его на submit. Недостаток: это выглядит странно.
$(form).submit(function() {
$('#Types').removeAttr('disabled');
});
или скопировать значение в скрытое поле при отправке.
$(form).submit(function() {
$('#HiddenField').val($('#Types').val());
});