[C con Clase] comparar dos cadenas

Steven Davidson srd4121 en njit.edu
Sab Feb 14 04:41:04 CET 2009


Hola Alejo,

Alejo Alejo wrote:
> Hola a todos, he corregido muchos problemas gracias a vosotros ya a 
> vuestra rapidez, y aunque ya estoy acabando el programa, me sigue 
> soltando un aviso que no se como resolverlo, o al menos lo que he 
> probado no ha funcionado...
> 

Muchos te han contestado, pero se han centrado más en la comparación, 
que es lo que preguntas. Mi aportación es comentarte acerca del código 
con el API de MYSQL.

> aviso: la comparación con una literal de cadena resulta en una
> conducta no especificada
> 
> Tengo,  :
> (si te das cuenta he corregido algunas cosas, jeje...)
> 
>   MYSQL_RES *res;
>     MYSQL_ROW row;
>     mysql_query(&conexion, "SELECT * FROM main");
> res = mysql_store_result(&conexion);
> int p=0;
> char array[40][40];
>     while ( (row = mysql_fetch_row(res)) )
>     {
>     strcpy(array[p],row[p]);
>     strcat(array[p],"\0");

Estas funciones no funcionarán correctamente, valga la redundancia. Si 
las cadenas apuntadas por 'row' no tienen el carácter nulo al final, 
entonces 'strcpy()' y 'strcat()' no funcionarán debidamente.

Recuerda que estas dos funciones estándares se basan en cadenas 
terminadas en cero. Por lo tanto, la solución es usar la longitud de 
cada cadena. Esto se puede hacer invocando 'mysql_fetch_lengths()'. Una 
vez que tengamos las longitudes, podemos usar 'strncpy()' o incluso 
'memcpy()'. Sinceramente, no necesitamos usar 'strncat()' ni 'strcat()', 
ya que no podemos agregar un carácter nulo al final, porque ésta termina 
de copiar caracteres al encontrar tal carácter nulo. Simplemente, 
asignamos el carácter nulo al último elemento. Esto es,

unsigned long *pLongitudes = mysql_fetch_lengths( res );
while( ... )
{
   memcpy( array[p], row[p], pLongitudes[p] );
   array[pLongitudes[p]] = 0;  /* Agregamos el carácter nulo al final */
}

Realmente, deberíamos comprobar que tales longitudes no sobrepasan la 
cantidad máxima de 'array[p]' que en este caso es 40.

>     p++;
> /*aqui nesecitaria que comparace la cadena con un texto, tipo: */
> if(array[p]=='!'){

Como ya te han comentado, puedes usar 'strcmp()' o incluso 'strncmp()' 
para comparar cadenas. Si quieres comparar un solo carácter, entones eso 
mismo estás haciendo.


Espero que esto aclare el asunto.

Steven





Más información sobre la lista de distribución Cconclase