Question

Par curiosité professionnelle, quel est le moyen le plus sûr / le plus rapide / le plus efficace de comparer deux chaînes entièrement numériques en C?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){

char str1[5] = "123";
char str2[5] = "123";
char *ptr;

if(atoi(str1) == atoi(str2))
    printf("Equal strings");

if(strtol(str1,&ptr,10) == strtol(str2,&ptr,10))
    printf("Equal strings");

if(strcmp(str1,str2)==0)
    printf("Equal strings");

return 0;
}
Était-ce utile?

La solution

strcmp () À mon avis, car il n'a pas besoin de conversions numériques. Mais dans ce cas, vous devez vous assurer que l'un d'eux stocke une chaîne qui ne contient que des caractères numériques.

Tu peux aussi faire memcmp () sur le fil

Edit1

Comme le souligne les autres sur les principaux zéros, vous pouvez scanner manuellement les zéros et appeler les principaux strcmp () ou memcmp () en passant un pointeur vers le premier chiffre non nul.

Edit2

Le code ci-dessous indique ce que j'essaie de dire. Ce n'est que pour les entiers, pas pour les nombres de points flottants.

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;
}

Pour les numéros de points flottants, les zéros de fuite après le point décimal doivent être coupés manuellement.

Ou faites les trucs entiers manuellement.

Edit4

J'aimerais également que vous jetiez un coup d'œil à ce code pour le point flottant. Cela détectera les zéros principaux avant les zéros décimaux et traînants après la décimale. Par exemple

00000000000001.10000000000000 et 1.1 sera Equal pour le code ci-dessous

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;
}

Besoin de quelques tests avant utilisation.

Autres conseils

str(n)cmp est le plus rapide et le plus sûr.

En supposant que vous les cherchez à être idite strncmp sera le plus rapide et le plus sûr car il peut faire une comparaison directe sans conversions. Il est également généralement considéré comme plus sûr que strcmp.

Cependant, si vous voulez 00 et 0 Pour être égal, ou d'autres façons de représenter le même nombre légèrement différemment, vous devrez utiliser atoi.

À mon avis, la manière "la plus sûre" serait probablement de convertir les deux arguments en entiers, puis de tester, comme vous éviterez le problème potentiel des oreilles. Ce n'est probablement pas la méthode la plus rapide ou la plus efficace, cependant.

Vous pouvez simplement utiliser la suite:

if (strcmp ("123", "123") == 0)

{

  printf("The strings are equal");

}

autre

{

  printf("The strings are not equal.");

}

À mon avis, cela devrait fonctionner.

Je suggère de cette façon pour les entiers:

int strcmp_for_integers(char *aa, char *bb){
    char aa2[11] = "";
    char bb2[11] = "";
    int answer;

    sprintf(aa2, "%010d", atoi(aa));
    sprintf(bb2, "%010d", atoi(bb));
    answer = strcmp(aa2, bb2);

    return answer;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top