2010-02-24 77 views
10

Estoy ordenando mi matriz de automóviles de dos maneras. uno por año, que se muestra a continuación. y otro por marca. Make es un char * ¿Cómo puedo comparar cadenas cuando solo tengo punteros para ellos?C o C++. ¿Cómo comparar dos cadenas dadas char * punteros?

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

El método anterior funciona para int (año). ¿Cómo puedo hacer que funcione para los indicadores de char?

+1

En una nota relacionada: lo hace saber que la ordenación de burbuja es requete ineficiente, ¿verdad? – rlbond

+3

En entradas muy grandes, es super-duper ineficiente. En tamaños de entrada pequeños, en realidad puede ser más rápido que los géneros más sexys, debido a que es tan simple de implementar. Por supuesto, en entradas pequeñas (como esta) la velocidad no es realmente una preocupación de todos modos. –

+2

Pero si está buscando ordenar entradas pequeñas, también podría usar la ordenación de inserción, que tiene un mejor rendimiento promedio, incluso si también es O (n^2) – bobDevil

Respuesta

27

En casi cualquiera de los dos, el modo es llamar al strcmp. Si sus cadenas (por algún extraño motivo) no tienen terminación NUL, en su lugar debe usar strncmp.

Sin embargo, en C++ no debería estar manipulando cadenas en matrices de caracteres si puede evitarlo razonablemente. Use std::string en su lugar.

+2

Como está ordenando, std :: sort es su amigo también http://www.cplusplus.com/reference/algorithm/sort/ Todo lo que necesita suministrar es una función de comparación para que use std :: sort. – Carl

13

Creo que necesita usar la función strcmp().

2

Asegúrese de que el carácter * no sea nulo, y si lo desea, busque la función stricmp() para las comparaciones insensibles a mayúsculas y minúsculas. De lo contrario, use strcmp().

char * en realidad representa la dirección de memoria del primer carácter en cada cadena. Entonces, realmente no desea comparar los valores de los apuntadores, sino los contenidos a los que apuntan.

+1

stricmp() no es estándar: http://stackoverflow.com/questions/1784767/g-error-stricmp-was-not-declared-in-this-scope-but-ok-for-strcmp Creo que es Microsoft -específico. –

+0

Si stricmp() no está en su biblioteca, también busque strcmpi() y si no está allí, strcasecmp(). Algo con esa funcionalidad estará allí. –

1

En C su función strcmp() ya se ha indicado. En C++ puede usar la función 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

Uhhh, no, no deberías usar 'compare' aquí. Esto es para lo que sirve el operador '==' en cadenas. El único motivo para usar la comparación es cuando le importa si una cadena es (alfabéticamente) menor o mayor que la otra. –

+0

@ T.E.D. la función 'compare' hace una comparación numérica (valor del carácter) en vez de alfabética. Es decir. una comparación lexicográfica de las cuerdas. – davmac

0

Estoy, por supuesto, asumiendo que aquí se tiene char * para el coche hace

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

desea comparar contra 0 porque strcmp devolverá 0 si no hay diferencia entre las dos cadenas.
strcmp toma dos const char *.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

0

realmente debería usar qsort (en C, #include <stdlib.h>) o std::sort (en C++, #include <algorithm>) en lugar de una especie de burbuja como este. Si es C++ y usted toma el consejo de @ T.E.D. de usar std::string en lugar de cadenas de C sin procesar, ni siquiera tiene que especificar una comparación porque se usará el operador < y hará lo correcto.

0

Cuando es necesario comparar dos punteros de char específicamente, se puede comparar en la forma habitual: mediante el uso de operadores de comparación, <>==, etc.

La cuestión de THS caso es que Don ' necesita comparar dos punteros de char. Lo que sí necesita, sin embargo, es comparar dos cadenas de estilo C a las que apuntan estos punteros de caracteres. Para comparar las cadenas estilo C, debe usar la función estándar strcmp.

Además de eso, el enfoque para manejar elementos nulos en su algoritmo de ordenación no parece tener ningún sentido en absoluto. Imagine una matriz de entrada que contiene punteros nulos alternativos y punteros no nulos. Es obvio que su algoritmo de clasificación nunca ordenará nada, ya que la condición en su if nunca será verdadera. Debe reconsiderar su manejo de elementos nulos. Por supuesto, antes que nada, debes decidir qué hacer con ellos. Ignorar y dejar en su lugar? Empujar a un extremo de la matriz? ¿Algo más?