Преобразование букв к числам в C

В прямом JavaScript Вы могли сделать что-то подобное следующему:

var kvpairs = [];
var form = // get the form somehow
for ( var i = 0; i < form.elements.length; i++ ) {
   var e = form.elements[i];
   kvpairs.push(encodeURIComponent(e.name) + "=" + encodeURIComponent(e.value));
}
var queryString = kvpairs.join("&");

Короче говоря, это создает список пар "ключ-значение" (name=value), который тогда объединен с помощью "&"; как разделитель.

6
задан Bill the Lizard 18 December 2012 в 15:45
поделиться

7 ответов

Если вам нужно иметь дело с прописными и строчными буквами, вы можете сделать что-то вроде:

if (letter >= 'A' && letter <= 'Z')
  num = letter - 'A';
else if (letter >= 'a' && letter <= 'z')
  num = letter - 'a';

Если вы хотите отобразить их, тогда вы захотите преобразовать число в значение ascii, добавив к нему «0»:

  asciinumber = num + '0';
9
ответ дан 8 December 2019 в 02:46
поделиться

Есть способ лучше.

В ASCII ( www.asciitable.com ) вы можете узнать числовые значения этих символов.

'A 'равно 0x41.

Таким образом, вы можете просто вычесть из них 0x41, чтобы получить числа. Я не очень хорошо знаю c, но что-то вроде:

int num = 'A' - 0x41;

должно работать.

5
ответ дан 8 December 2019 в 02:46
поделиться

Еще одна, гораздо худшая (но все же лучше, чем 26 операторов if ) альтернатива - использовать переключатель / case :

switch(letter)
{
case 'A':
case 'a': // don't use this line if you want only capital letters
    num = 0;
    break;
case 'B':
case 'b': // same as above about 'a'
    num = 1;
    break;
/* and so on and so on */
default:
    fprintf(stderr, "WTF?\n");
}

Учитывайте это, только если нет абсолютно никакой связи между буквой и ее кодом. Поскольку в вашем случае существует четкая последовательная связь между буквой и кодом, использовать это довольно глупо и будет ужасно поддерживать, но если вам нужно было кодировать случайные символы в случайные значения, это был бы способ избежать записи миллион if () / else if () / else if () / else операторов.

5
ответ дан 8 December 2019 в 02:46
поделиться

В большинстве языков программирования и сценариев есть средства для получения "порядкового" значения любого символа. (Думайте об этом как о смещении от начала набора символов.)

Таким образом, вы обычно можете сделать что-то вроде:

for ch in somestring:
    if lowercase(ch):
        n = ord(ch) - ord ('a')
    elif uppercase(ch):
        n = ord(ch) - ord('A')
    else:
        n = -1  # Sentinel error value
        # (or raise an exception as appropriate to your programming
        #  environment and to the assignment specification)

Конечно, это не сработает для системы на основе EBCDIC (и может не сработать для некоторых других экзотические наборы символов). Я полагаю, что разумной проверкой было бы, если бы эта функция вернула монотонно возрастающие значения в диапазоне 0..26 для строк «abc ... xzy» и «ABC ... XYZ»).

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

Естественно, я не "

0
ответ дан 8 December 2019 в 02:46
поделиться

Я считаю, что этот способ лучше, чем метод переключателя , но при этом он соответствует стандартам (не предполагает ASCII):

#include <string.h>
#include <ctype.h>

/* returns -1 if c is not an alphabetic character */
int c_to_n(char c)
{
    int n = -1;
    static const char * const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char *p = strchr(alphabet, toupper((unsigned char)c));

    if (p)
    {
        n = p - alphabet;
    }

    return n;
}
11
ответ дан 8 December 2019 в 02:46
поделиться

Поскольку тип данных char обрабатывается аналогично типу данных int в C и C ++, вы можете использовать что-нибудь вроде:

char c = 'A';   // just some character

int urValue = c - 65;

Если вас беспокоит чувствительность к регистру:

#include <ctype.h> // if using C++ #include <cctype>
int urValue = toupper(c) - 65;
-1
ответ дан 8 December 2019 в 02:46
поделиться

Ой, если бы у вас был C ++

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

typedef std::map<wchar_t, int> WCharValueMap;
WCharValueMap myConversion = fillMap();

WCharValueMap fillMap() {
  WCharValueMap result;
  result[L'A']=0;
  result[L'Â']=0;
  result[L'B']=1;
  result[L'C']=2;
  return result;
}

использование

int value = myConversion[L'Â'];
-1
ответ дан 8 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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