привет я получил проблему с сравнения двух полукокса * переменные, которые содержат числа, например char1 = "999999"
и char2="11111111"
, когда я использую функцию strcmp
он возвращает эту переменную char1 больше char2 даже Тхо его неправильно. (я знаю, что я могу сравнить с использованием функции atoi до 9 символов внутри строки, но мне нужно использовать 10, чтобы она разрезала эту возможность).Проблема сравнения строк, содержащих числа
ответ
Немного более громоздкий способ, который позволяет избежать atoi
и друзей, является префикс более короткой из двух строк с нулями. Или, если предположить, нет префиксов нулей, просто первого сравнение длины (с более короткими строками должны иметь более низкое значение), то работает lexiographic сравнения:
int numerical_strcmp(const char* a, const char* b) {
return (strlen(a) != strlen(b)) ? ((strlen(a) > strlen(b)) ? 1 : -1) : strcmp(a, b);
}
Ой, а это требует последовательности, чтобы содержать неотрицательные номера.
Собственно, это правильно. Он выполняет строковое сравнение содержимого строк, а не числовое.
Как быстро и грязного хака, при условии, что вы уже подтверждено, что строки содержат целые положительные числа, вы можете сделать следующее:
if (strlen(char2) > strlen(char1)) {
// char2 > char1
} else if (strlen(char2) == strlen(char1)) {
cmp = strcmp(char2, char1);
if (cmp > 0) {
// char2 > char 1
} else if (cmp == 0) {
// char2 == char1
} else {
// char2 < char1
}
} else {
// char2 < char1
}
есть способ, чтобы сравнить его в соответствии с числовым значением строки? причина, это то, что мне нужно для моего comperisson –
Да - см. Выше. Если одна строка длиннее или короче другой, то это только определяет ответ; если они имеют одинаковую длину, то можно использовать strcmp(). –
Приказано в буквальном смысле, а это значит, что что-то начиная с 9 всегда будет больше, чем что-то, начиная с 1. Если вам нужно провести целочисленное сравнение, вам придется использовать atoi.
Я не могу использовать atoi, потому что моя строка может содержать 10 символов внутри него и atoi/atol не работает –
Если строки не имеют ведущий/ведомый мусора, использовать этот алгоритм:
- Сравните длины два строк с использованием
strlen()
. Более длинный всегда самый большой. - Если длина равна, используйте
strcmp()
.
Вы можете преобразовать строку в 64-разрядное целое, используя _atoi64
. Затем вы можете просто сравнить их, как и следовало ожидать. В зависимости от вашего компилятора _atoi64
можно назвать чем-то другим.
кратчайший путь должен быть:
int mystrcmp(const char *a,const char *b)
{
return strlen(a)-strlen(b)?strlen(a)-strlen(b):strcmp(a,b);
}
- 1. Подсчет числа строк, содержащих шаблон
- 2. Как отсортировать массив строк, содержащих числа
- 3. C# Сортировка списка строк, содержащих числа
- 4. как отсортировать массив строк, содержащих числа, численно
- 5. Java Comparator для строк, содержащих целые числа
- 6. Сортировка JavaScript массив строк, содержащих числа
- 7. Как построить массив ячеек строк, содержащих числа
- 8. Как отсортировать список строк, содержащих числа численно
- 9. Удаление строк, содержащих перечисленные числа, в excel
- 10. Проблема сравнения строк в PHP
- 11. else, если проблема сравнения строк
- 12. Проблема сравнения строк в C++
- 13. Левенштейн сравнения строк без изменения числа
- 14. проблема сравнения строк python в списке
- 15. Сортировка списков, содержащих числа
- 16. Проблема сравнения строк Java с пробелами
- 17. MYSQL подзапросов и подсчет числа строк, содержащих значение
- 18. Как создать список строк, содержащих произвольно сгенерированные числа в Java?
- 19. Регулярное выражение для нахождения строк, содержащих числа больше 1000
- 20. Объединение строк списков в столбце, содержащих целые числа с Python
- 21. Использование строк, содержащих целые числа в виде ключей таблицы
- 22. Сортировка строк, содержащих число
- 23. Удаление строк, содержащих ASCII
- 24. Удаление строк, содержащих нуль
- 25. Замена строк, содержащих $ символов
- 26. Разделение строк, содержащих значения
- 27. Поиск строк, содержащих знак «@»
- 28. Сравнения строк
- 29. regex для сравнения числа
- 30. Эффективный алгоритм сравнения частей списков, содержащих наборы
у вас должно быть не менее кэшированное strlen(), в результате получается переменная. – Dummy00001
btw, я часто делаю 'int x = (strlen (a) - strlen (b));' как для сохранения одной переменной. – Dummy00001