2010-02-24 3 views
10

Ich sortiere meine Reihe von Auto zwei Wege. eines nach dem anderen, das unten gezeigt wird. und noch eins nach make. Make ist ein char * Wie kann ich Strings vergleichen, wenn ich nur Zeiger darauf habe?C oder C++. Wie vergleicht man zwei Zeichenfolgen mit char * -Zeigern?

int i, j; 
for(i=0; i<100; i++){ 
    for(j=0; j<100-i; j++){ 
     if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){ 
      if(carArray[i]->year > carArray[j+1]->year){ 
       swap(carArray[j], carArray[j+1]); 
      } 
     } 
    } 
} 

Die obige Methode funktioniert für int (Jahr). Wie kann ich es für Char-Zeiger arbeiten lassen?

+1

auf einem nicht verwandten Notiz vergleichen: Sie wissen nicht, dass Blase Art Super-Duper ineffizient ist, nicht wahr? – rlbond

+3

Bei sehr großen Eingängen ist es super-ineffizient. Bei kleinen Eingabegrößen kann es sogar schneller sein als bei anderen sexy Sorten, da es so einfach zu implementieren ist. Natürlich ist bei kleinen Eingaben (wie diesem) die Geschwindigkeit sowieso kein Thema. –

+2

Aber wenn Sie kleine Eingaben sortieren möchten, können Sie auch Insertion Sort verwenden, die eine bessere durchschnittliche Leistung hat, auch wenn es auch O (n^2) ist. – bobDevil

Antwort

27

In so ziemlich jeder, der Weg ist strcmp anrufen. Wenn Ihre Zeichenfolgen (aus irgendeinem seltsamen Grund) nicht NULL-terminiert sind, sollten Sie stattdessen strncmp verwenden.

jedoch in C++ Sie sollten wirklich nicht Strings in char-Arrays manipuliert werden, wenn man es ganz vermeiden können. Verwenden Sie stattdessen std::string.

+2

Da Sie sortieren, ist std :: sort Ihr Freund auch. http://www.cplusplus.com/reference/algorithm/sort/ Alles, was Sie liefern müssen, ist eine Vergleichsfunktion für std :: sort. – Carl

13

Ich denke, Sie müssen die strcmp() -Funktion verwenden.

2

Stellen Sie sicher, die char * nicht Null ist, und wenn Sie wollen, suchen die stricmp() Funktion für Groß- und Kleinschreibung Vergleiche. Ansonsten benutze strcmp().

char * repräsentiert tatsächlich die Speicheradresse des ersten Zeichens in jeder Kette. Sie wollen also nicht wirklich die Werte der Zeiger vergleichen, sondern die Inhalte, auf die sie zeigen.

+1

stricmp() ist nicht Standard: http://stackoverflow.com/questions/1784767/g-error-stricmp-was-not-declared-in-this-scope-but-ok-for-strcmp Ich denke, es ist Microsoft -Spezifisch. –

+0

Wenn sich stricmp() nicht in Ihrer Bibliothek befindet, überprüfen Sie auch, ob strcmpi() vorhanden ist, und wenn das nicht der Fall ist, strcasecmp(). Etwas mit dieser Funktionalität wird da sein. –

1

In C ist seine Funktion strcmp() wie bereits erwähnt. In C++ können Sie die Funktion compare() verwenden.

C:

char str1[10] = "one"; 
char str2[10] = "two"; 

if (strcmp(s, t) != 0) // if they are equal compare return 0 

C++

string str1 ("one"); 
string str2 ("two"); 
if (str1.compare(str2) != 0) // if they are equal compare return 0 
+0

Uhhh, nein, du solltest hier nicht 'compare' verwenden. Dies ist der Operator "==" für Strings. Der einzige Grund für den Vergleich ist, wenn Sie sich darum kümmern, ob eine Zeichenfolge (alphabetisch) kleiner oder größer als die andere ist. –

+0

@ T.E.D. Die Funktion "Vergleichen" führt einen numerischen (Zeichenwert) und keinen alphabetischen Vergleich durch. I.e. ein lexikographischer Vergleich der Strings. – davmac

0

Ich bin natürlich hier vorausgesetzt, Sie char haben * für das Auto macht

int i, j; 
for(i=0; i<100; i++){ 
    for(j=0; j<100-i; j++){ 
     if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){ 
      if(strcmp(carArray[i]->make, carArray[j+1]->make) == 0) 
      { 
       //Do whatever here 
      } 
     } 
    } 
} 

Sie gegen 0 vergleichen wollen, weil strcmp gibt 0 zurück, wenn zwischen den beiden Strings kein Unterschied besteht.
strcmp benötigt zwei const char *.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

0

Sie sollten wirklich qsort verwenden (in C, #include <stdlib.h>) oder std::sort (in C++, #include <algorithm>) anstelle einer Blase Art wie diese. Wenn es C++ und Sie nehmen @ T.E.D. Rat std::string anstelle von rohen C-Strings zu verwenden, müssen Sie nicht einmal einen Vergleich angeben, da der < Operator verwendet werden soll und das Richtige tun.

0

Wenn Sie benötigen speziellzwei char Zeiger zu vergleichen, können Sie sie in der üblichen Weise vergleichen: von Vergleichsoperatoren mit <, >, == usw.

Das Problem in ths Fall ist, dass Sie don 't müssen zwei Zeichen Zeiger vergleichen. Was Sie jedoch brauchen, ist zu vergleichen zwei C-Stil-Strings diese Zeichen Zeiger zeigen auf. Um die C-Style-Strings zu vergleichen, müssen Sie die Standardfunktion strcmp verwenden.

Obendrein, scheint der Ansatz zur Behandlung von Null-Elemente in Ihrem Sortieralgorithmus überhaupt keinen Sinn. Stellen Sie sich ein Eingabe-Array vor, das alternierende Null-Zeiger und Nicht-Null-Zeiger enthält. Es ist offensichtlich, dass Ihr Sortieralgorithmus nie etwas sortieren wird, da die Bedingung in Ihrem if niemals wahr sein wird. Sie müssen Ihre Handhabung von Nullelementen überdenken. Natürlich müssen Sie sich zuerst entscheiden, was Sie damit machen sollen. Ignorieren und an Ort und Stelle bleiben? Auf ein Ende des Arrays drücken? Etwas anderes?