Я ищу способ взять строку и проверить 3 возможности.
- Digit и, таким образом, преобразует его в подписанный int (не длинный)
- Является символьным представлением, ранее определенным во время выполнения, и преобразует его в целое число со знаком.
- Ни один
«Символическое представление» будет в основном похоже на ассоциативный массив, который начинается с 0 элементов и расширяется по мере добавления новых символов. Например, скажем, например, что у C были ассоциативные массивы (я бы хотел) с этим peusdocode:
symbol_array['q'] = 3;
symbol_array['five'] = 5;
symbol_array['negfive'] = -5;
symbol_array['random294'] = 28;
signed int i;
string = get_from_input();
if(!(i = convert_to_int(string))) {
if(!(i = translate_from_symbol(string))) {
printf("Invalid symbol or integer\n");
exit(1);
}
}
printf("Your number: %d\n, i);
Идея заключалась в том, что если бы они ввели «5», они преобразовали бы его в 5 с помощью convert_to_int, а если бы они ввели «пять», они бы преобразовали его в 5 с помощью translate_from_symbol. Что, по моему мнению, может быть самым сложным, так это то, что если бы они ввели «random294», это преобразовало бы его не в 294, а в 28. Если бы они ввели «foo», то он вышел бы (1).
Мои общие вопросы таковы: (Вместо того, чтобы делать несколько сообщений)
При создании convert_to_int
я знаю, что не должен использовать atoi
, потому что он не ошибается. Некоторые люди говорят, что нужно использовать strtol
, но кажется утомительным преобразовывать его обратно в недлинный int. Упрощенный (читай: кратчайший) способ, который я нашел, использует sscanf
:
int i;
if ((sscanf(string, "%d", &i)) == 1){
return i;
}
Однако некоторые люди смотрят на это даже свысока. Какой метод лучше, если не sscanf или преобразование strtol?
Во-вторых, как я могу не только вернуть целое число, но и узнать, нашел ли он его. Например, если пользователь ввел «0», то он вернет 0, таким образом установив FALSE в моем выражении if. Я думал об использовании -1, если он не найден, но, поскольку я возвращаю подписанные целые числа, это также страдает от той же проблемы. В PHP я знаю, например, что с strpos
они используют === FALSE
Наконец, есть ли короткий код, который эмулирует ассоциированные массивы и/или позволяет добавлять элементы в массив во время выполнения?