C - Vergleichen von numerischen Zeichenfolgen
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;
}
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;
}