Frage

Was ist aus professioneller Neugier die sicherste / schnellste / effizienteste Methode, um zwei vollständig numerische Zeichenfolgen in C zu vergleichen?

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

War es hilfreich?

Lösung

strcmp () meiner Meinung nach, da keine numerischen Konvertierungen erforderlich sind. In diesem Fall müssen Sie jedoch sicherstellen, dass einer von ihnen eine Zeichenfolge speichert, die nur numerische Zeichen enthält.

Sie können auch memcmp () für die Zeichenfolge erstellen

EDIT1

Wie von anderen über die führenden Nullen ausgeführt, können Sie die führenden Nullen manuell durchsuchen und strcmp () oder memcmp () aufrufen, indem Sie einen Zeiger auf die erste Ziffer ungleich Null übergeben.

EDIT2

Der folgende Code sagt, was ich zu sagen versuche. Dies gilt nur für Ganzzahlen, nicht für Gleitkommazahlen.

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

Bei Gleitkommazahlen sollten die nachgestellten Nullen nach dem Dezimalpunkt manuell herausgeschnitten werden.

Oder machen Sie das ganze manuell.

EDIT4

Ich möchte auch, dass Sie sich diesen Code für Gleitkommazahlen ansehen. Dadurch werden führende Nullen vor der Dezimalstelle und nachfolgende Nullen nach der Dezimalstelle erkannt. Zum Beispiel

00000000000001.10000000000000 und 1.1 sind Equal für den folgenden Code

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

Muss vor der Verwendung getestet werden.

Andere Tipps

str(n)cmp ist der schnellste und sicherste.

Angenommen, Sie möchten, dass sie identisch sind, ist strncmp der schnellste und sicherste, da ein direkter Vergleich ohne Konvertierungen möglich ist.Es wird auch allgemein als sicherer als strcmp angesehen.

Wenn Sie jedoch möchten, dass 00 und 0 gleich sind oder auf andere Weise, dass Sie dieselbe Zahl leicht unterschiedlich darstellen können, müssen Sie atoi verwenden.

Meiner Meinung nach wäre der "sicherste" Weg wahrscheinlich, beide Argumente in ganze Zahlen umzuwandeln und dann zu testen, da Sie auf diese Weise das potenzielle Problem der führenden Nullen vermeiden.Es ist jedoch wahrscheinlich nicht die schnellste oder effizienteste Methode.

Sie können einfach Folgendes verwenden:

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

{

  printf("The strings are equal");

}

sonst

{

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

}

Meiner Meinung nach sollte es funktionieren.

Ich schlage diesen Weg für ganze Zahlen vor:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top