Создание раскрывающегося списка только для чтения, но при этом отправка его значения

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-последовательности:

  • \ a - Bell (beep)
  • \ b - Backspace
  • \ f - Formfeed
  • \n - Новая строка
  • \r - Возврат каретки
  • \ t - Горизонтальная вкладка
  • \\ - Обратная сляка
  • \ '- Одиночная марка котирования
  • \ "- Двойной знак четности
  • \ ooo - Октальное представление
  • \ xdd - Шестнадцатеричное представление

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 Теперь у вас есть все ответы, поэтому вам нужно, что вы реализуете, что дает вам наилучшие результаты.

13
задан Community 23 May 2017 в 12:17
поделиться

3 ответа

Это предполагаемое поведение на стороне веб-браузера - отключенный элемент управления не будет отправлять свои данные на сервер при отправке формы.

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

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

20
ответ дан 1 December 2019 в 19:07
поделиться
  1. Вместо этого сделайте его текстовым полем.
  2. Добавьте событие изменения с помощью JavaScript:

    $ ('# dropdown'). Change (function (e) {e.preventDefault ();});

  3. Создайте раскрывающийся список, содержащий только 1 элемент. .

  4. Имейте скрытый элемент с фактическим значением раскрывающегося списка, чтобы он отправлялся, даже если отключенный раскрывающийся список этого не делает.
7
ответ дан 1 December 2019 в 19:07
поделиться

Вы можете включить его на submit. Недостаток: это выглядит странно.

$(form).submit(function() {
  $('#Types').removeAttr('disabled');
});

или скопировать значение в скрытое поле при отправке.

$(form).submit(function() {
  $('#HiddenField').val($('#Types').val());
});
10
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: