strcmp ()
на мой взгляд, так как не нуждается в числовых преобразованиях. Но в этом случае вам нужно убедиться, что один из них хранит строку, которая содержит только числовые символы.
Также вы можете сделать memcmp ()
на строку
EDIT1
Как уже отмечалось другими о ведущих нулях, вы можете вручную просмотреть начальные нули и вызвать strcmp ()
или memcmp ()
, передав указатель на первую ненулевую цифру.
EDIT2
Код ниже говорит о том, что я пытаюсь сказать. Это только для целых чисел, а не для чисел с плавающей запятой.
int main (void)
{
char s1[128], s2[128];
char *p1 = s1, *p2 = s2;
/* populate s1, s2 */
while (*p1 && (*p1 == '0'))
p1++;
while (*p2 && (*p2 == '0'))
p2++;
if (strcmp (p1, p2) == 0)
printf ("\nEqual");
else
printf ("\nNot equal");
printf ("\n");
return 0;
}
Для чисел с плавающей запятой конечные нули после десятичной запятой должны быть вырезаны вручную.
Или все это сделать вручную.
EDIT4
Я также хотел бы, чтобы вы взглянули на этот код с плавающей запятой. Это позволит обнаружить ведущие нули до десятичной дроби и конечные нули после десятичной. Например
00000000000001.10000000000000
и 1.1
будут Equal
для кода ниже
int main (void)
{
char s1[128], s2[128];
char *p1, *p2, *p1b, *p2b;
printf ("\nEnter 1: ");
scanf ("%s", s1);
printf ("\nEnter 2: ");
scanf ("%s", s2);
p1 = s1;
p2 = s2;
/* used for counting backwards to trim trailing zeros
* in case of floating point
*/
p1b = s1 + strlen (s1) - 1;
p2b = s2 + strlen (s2) - 1;
/* Eliminate Leading Zeros */
while (*p1 && (*p1 == '0'))
p1++;
while (*p2 && (*p2 == '0'))
p2++;
/* Match upto decimal point */
while (((*p1 && *p2) && ((*p1 != '.') && (*p2 != '.'))) && (*p1 == *p2))
{
p1++;
p2++;
}
/* if a decimal point was found, then eliminate trailing zeros */
if ((*p1 == '.') && (*p2 == '.'))
{
/* Eliminate trailing zeros (from back) */
while (*p1b == '0')
p1b--;
while (*p2b == '0')
p2b--;
/* match string forward, only upto the remaining portion after
* discarding of the trailing zero after decimal
*/
while (((p1 != p1b) && (p2 != p2b)) && (*p1 == *p2))
{
p1++;
p2++;
}
}
/* First condition on the LHS of || will be true for decimal portion
* for float the RHS will be . If not equal then none will be equal
*/
if (((*p1 == '\0') && (*p2 == '\0')) || ((p1 == p1b) && (p2 == p2b)))
printf ("\nEqual");
else
printf ("\nNot equal");
printf ("\n");
return 0;
}
Перед использованием требуется некоторое тестирование.