Проблема сравнения строк, содержащих числа - PullRequest
3 голосов
/ 22 августа 2010

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

Ответы [ 6 ]

4 голосов
/ 22 августа 2010

Немного более громоздким способом, который избегает atoi и друзей, является добавление нуля в качестве короткой из двух строк.Или, предполагая, что нет нулей с префиксом, просто сначала сравните длину (поскольку более короткие строки должны иметь меньшее значение), затем запустите лексикографическое сравнение:

int numerical_strcmp(const char* a, const char* b) {
    return (strlen(a) != strlen(b)) ? ((strlen(a) > strlen(b)) ? 1 : -1) : strcmp(a, b);
}

Oh, и это требует, чтобы строки не-отрицательные числа.

4 голосов
/ 22 августа 2010

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

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

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
}
3 голосов
/ 22 августа 2010

Если в строках нет начального / конечного мусора, используйте этот алгоритм:

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

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

int mystrcmp(const char *a,const char *b)
{
  return strlen(a)-strlen(b)?strlen(a)-strlen(b):strcmp(a,b);
}
1 голос
/ 22 августа 2010

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

0 голосов
/ 22 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...