2010-02-24 3 views
10

Je trier mon tableau de voiture de deux façons. un par an qui est montré ci-dessous. et un autre par marque. Make est un char * Comment puis-je comparer les chaînes quand je n'ai que des pointeurs?C ou C++. Comment comparer deux chaînes données avec des pointeurs char *?

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

La méthode ci-dessus fonctionne pour int (année). Comment puis-je le faire fonctionner pour les pointeurs char?

+1

Sur une note sans rapport: vous savez ce genre de bulle est super-duper inefficace, non? – rlbond

+3

Sur de très grandes entrées, il est inefficace. Sur de petites tailles d'entrée, il peut en réalité être plus rapide que les sortes plus sexy, en raison de sa simplicité d'implémentation. Bien sûr, sur les petites entrées (comme celle-ci), la vitesse n'est pas vraiment un problème de toute façon. –

+2

Mais si vous cherchez à trier les petites entrées, vous pouvez aussi utiliser le tri d'insertion, qui a une meilleure performance moyenne, même si c'est aussi O (n^2) – bobDevil

Répondre

27

Dans à peu près un, la façon est d'appeler strcmp. Si vos chaînes (pour une raison étrange) ne sont pas terminées par NUL, vous devez utiliser strncmp à la place.

Cependant, en C++, vous ne devriez vraiment pas manipuler des chaînes dans des tableaux char si vous pouvez raisonnablement l'éviter. Utilisez std::string à la place.

+2

Depuis votre tri, std :: sort est votre ami aussi. http://www.cplusplus.com/reference/algorithm/sort/ Tout ce que vous devez fournir est une fonction de comparaison pour std :: sort à utiliser. – Carl

13

Je pense que vous devez utiliser la fonction strcmp().

2

Assurez-vous que le caractère * n'est pas nul et, si vous le souhaitez, recherchez la fonction strictmp() pour les comparaisons insensibles à la casse. Sinon, utilisez strcmp(). Char * représente en réalité l'adresse mémoire du premier caractère de chaque chaîne. Donc, vous ne voulez pas vraiment comparer les valeurs des pointeurs, mais les contenus vers lesquels ils pointent.

+1

strictmp() n'est pas standard: http://stackoverflow.com/questions/1784767/g-error-stricmp-was-not-declared-in-this-scope-but-ok-for-strcmp Je pense que c'est Microsoft -spécifique. –

+0

Si strictmp() ne se trouve pas dans votre bibliothèque, vérifiez également strcmpi() et si ce n'est pas le cas strcasecmp(). Quelque chose avec cette fonctionnalité sera là. –

1

Dans C sa fonction strcmp() comme déjà indiqué. En C++, vous pouvez utiliser la fonction compare().

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

Euhhh, non, vous ne devriez pas utiliser 'compare' ici. C'est ce que l'opérateur '==' sur les chaînes est pour. La seule raison d'utiliser comparer est quand vous vous souciez de savoir si une chaîne est (alphabétiquement) inférieure ou supérieure à l'autre. –

+0

@ T.E.D. la fonction 'compare' fait une comparaison numérique (valeur de caractère) plutôt qu'une comparaison alphabétique. C'est à dire. une comparaison lexicographique des cordes. – davmac

0

Je suis bien sûr en supposant ici que vous avez char * pour la voiture fait

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

Vous voulez comparer à 0 parce que strcmp retournera 0 s'il n'y a pas de différence entre les deux chaînes.
strcmp prend deux const char *.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

0

Vous devriez vraiment utiliser qsort (en C, #include <stdlib.h>) ou std::sort (en C++, #include <algorithm>) au lieu d'une sorte de bulle comme ça. Si c'est le C++ et que vous prenez les conseils de @ T.E.D. pour utiliser std::string au lieu de chaînes C brutes, vous n'avez même pas besoin de spécifier une comparaison car l'opérateur < sera utilisé et fera le bon choix.

0

Lorsque vous avez besoin de comparer deux pointeurs ombles spécifiquement, vous pouvez les comparer de la manière habituelle: en utilisant les opérateurs de comparaison <, >, == etc.

La question dans ths cas est que vous don 't besoin de comparer deux pointeurs char. Ce que vous avez besoin cependant, est de comparer deux chaînes de style C ces pointeurs char pointent vers. Afin de comparer les chaînes de style C, vous devez utiliser la fonction standard strcmp.

En plus de cela, l'approche de gestion des éléments NULL dans votre algorithme de tri ne semble pas avoir de sens. Imaginez un tableau d'entrée qui contient alternativement des pointeurs NULL et des pointeurs non NULL. Il est évident que votre algorithme de tri ne triera jamais rien, puisque la condition dans votre if ne sera jamais vraie. Vous devez reconsidérer votre gestion des éléments NULL. Bien sûr, tout d'abord, vous devez décider quoi faire avec eux. Ignorer et laisser en place? Pousser à une extrémité du tableau? Somethng autre?

Questions connexes