2010-08-22 3 views
3

привет я получил проблему с сравнения двух полукокса * переменные, которые содержат числа, например char1 = "999999" и char2="11111111" , когда я использую функцию strcmp он возвращает эту переменную char1 больше char2 даже Тхо его неправильно. (я знаю, что я могу сравнить с использованием функции atoi до 9 символов внутри строки, но мне нужно использовать 10, чтобы она разрезала эту возможность).Проблема сравнения строк, содержащих числа

ответ

4

Немного более громоздкий способ, который позволяет избежать 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); 
} 

Ой, а это требует последовательности, чтобы содержать неотрицательные номера.

+1

у вас должно быть не менее кэшированное strlen(), в результате получается переменная. – Dummy00001

+0

btw, я часто делаю 'int x = (strlen (a) - strlen (b));' как для сохранения одной переменной. – Dummy00001

4

Собственно, это правильно. Он выполняет строковое сравнение содержимого строк, а не числовое.

Как быстро и грязного хака, при условии, что вы уже подтверждено, что строки содержат целые положительные числа, вы можете сделать следующее:

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 
} 
+0

есть способ, чтобы сравнить его в соответствии с числовым значением строки? причина, это то, что мне нужно для моего comperisson –

+0

Да - см. Выше. Если одна строка длиннее или короче другой, то это только определяет ответ; если они имеют одинаковую длину, то можно использовать strcmp(). –

0

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

+0

Я не могу использовать atoi, потому что моя строка может содержать 10 символов внутри него и atoi/atol не работает –

3

Если строки не имеют ведущий/ведомый мусора, использовать этот алгоритм:

  • Сравните длины два строк с использованием strlen(). Более длинный всегда самый большой.
  • Если длина равна, используйте strcmp().
1

Вы можете преобразовать строку в 64-разрядное целое, используя _atoi64. Затем вы можете просто сравнить их, как и следовало ожидать. В зависимости от вашего компилятора _atoi64 можно назвать чем-то другим.

1

кратчайший путь должен быть:

int mystrcmp(const char *a,const char *b) 
{ 
    return strlen(a)-strlen(b)?strlen(a)-strlen(b):strcmp(a,b); 
} 
Смежные вопросы