2009-11-23 21 views
25

que estoy tratando de recopilar la siguiente pieza muy simple de código fuente:g ++ error: 'stricmp' no estaba declarado en este ámbito (pero está bien para 'strcmp')

#include <cstring> 
// #include <string.h> 
// using namespace std; 

class Helper { 
public: 
    int cStringsAreEqual(const char *s1, const char *s2) { 
     return stricmp(s1, s2); 
    } 
}; 

... pero estoy recibiendo el siguiente mensaje de error:

g++ error: ‘stricmp’ was not declared in this scope 

Sin embargo cuando utilizo strcmp() en lugar destricmp() entonces todo está bien!

¿Qué puede estar mal aquí? ¿No debería permitirse stricmp() cuando se permite strcmp()?

Sureley, esto podría escribirse de una manera mucho mejor sin usar strcmp/stricmp.

Pero ese no es el punto aquí.

Estoy portando un programa que hace mucho uso de las llamadas a stricmp(). Y si de alguna manera es posible, me gustaría evitar todos los esfuerzos necesarios para cambiar cada llamada a stricmp.

¡Cualquier ayuda en esto sería muy apreciada!

BTW: Estoy usando Ubuntu karmic OS (v9.10) con g ++ v4.4.1.

BTW: como puedes ver, también hice algunas pruebas con '#include string.h' o con 'namespace std' pero nada ayudó.

+0

Teniendo en cuenta que stricmp y strcmp no son lo mismo (este último es mayúsculas y minúsculas), es posible que desee hesistate antes de cambiarlos de todos modos. – Brian

+2

Yo * sé * que no son lo mismo. Es por eso que quiero usar stricmp y no strcmp –

+0

Note también que '' y '' no son exactamente los mismos. No es la causa de su problema, pero necesitará escribir 'std :: strcmp' (o' std :: strcoll') en lugar de asumir que los nombres se importen en el espacio de nombres global. –

Respuesta

34

Probar strcasecmp(). Aquí está el manual page para él. Es conforme a 4.4BSD y POSIX.1-2001.

+0

Esa sería una opción.strcasecmp() parece tener los mismos parámetros. Entonces no debería ser difícil crear una pequeña secuencia de comandos perl que haga un cambio global. ¡Muchas gracias! –

+0

No hay problema. También eche un vistazo al comentario de Mark Rushakoff sobre cómo la configuración regional afecta esta función. – Gonzalo

+1

Tenga en cuenta que strcasecmp depende de su configuración regional. Por lo tanto, strcasecmp ("div", "DIV") NO devolverá 0 en una configuración regional turca (la I minúscula es ı). Eso significa que importa de dónde viene su cadena :-(. Hay otros ejemplos en otros idiomas. Puede romper su programa para usuarios extranjeros. – rockdaboot

13

stricmp is neither POSIX nor ANSI, por lo que no importa si strcmp está permitido, si su compilador o biblioteca estándar se adhiere estrictamente a las funciones de biblioteca estándar POSIX o ANSI (como probablemente sea el caso del paquete GCC).

+0

¿existe una alternativa POSIX/ANSI con la misma semántica? –

+3

Es complicado, porque la idea de "sensibilidad de mayúsculas y minúsculas" puede depender de su configuración regional o sistema operativo. Vea algunas de las respuestas en esta pregunta: http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c –

+0

Estoy usando Eclipse CDT en Windows 7 con Cygwin, y se acepta stricmp allí. En mi máquina Linux, con GCC no se acepta. ¿Eso significa que el compilador incluido con Cygwin NO ES POSIX o ANSI? –

10

Agregue una definición para sobrescribir stricmp con strcasecmp en las plataformas que está buscando.

#ifdef _IPHONE <- your platform define here 
#define stricmp strcasecmp 
#define strnicmp strncasecmp 
#endif 

Entonces solo puede usar stricmp siempre.

+0

Tuve el mismo error y lo resolví con éxito. –

+0

¿dónde ponemos esto? –

+0

Simplemente póngalo en un encabezado o en la parte superior con cualquier otra directiva de preprocesador (ifdefs/define): http://www.cplusplus.com/doc/tutorial/preprocessor/ #define _IPHONE cambiaría al uso anterior menos el " <- .. "parte" –

-1

bastante fácil de hacer su propia si es necesario ...

int my_stricmp (const char *s1, const char *s2) 
{ 
    while (*s1 != 0 && *s2 != 0) 
    { 
     if (*s1 != *s2 && ::toupper (*s1) != ::toupper(*s2)) 
     { 
      return -1; 
     } 
     s1++; 
     s2++; 
    } 
    return (*s1 == 0 && *s2 == 0) ? 0 : -1; 
} 
+0

¿Cómo devuelve esto un valor positivo cuando 's1' ordena más tarde que' s2'? ¿O tiene la intención de tener una interfaz diferente a 'std :: strcmp()'? –

+0

Problema solucionado @TobySpeight También se corrigió si la lógica. –

+1

'CAVEAT': Las llamadas a' :: toupper' son específicas de la configuración regional. Puede obtener diferentes resultados dependiendo de dónde se ejecute esto. Considere utilizar las anulaciones conocidas de la configuración regional. en cambio. –

Cuestiones relacionadas