El subíndice de matriz tiene el tipo ‘char’

Estoy tratando de eliminar los caracteres de espacio en blanco iniciales y finales con la ayuda debajo de la función auxiliar. Al comstackr, recibo una advertencia: el subíndice array tiene el tipo ‘char’ [-Wchar-subcripts] cómo deshacerse de este mensaje.

char *removeSpace(char *str ) { char *end; // Trim leading space while(isspace(*str)) str++; if(*str == 0) // All spaces? return str; // Trim trailing space end = str + strlen(str) - 1; while(end > str && isspace(*end)) end--; // Write new null terminator *(end+1) = 0; return str; } 

La advertencia puede deberse a que está pasando un char a la macro isspace() . La implementación de isspace() puede ser a través de la indexación de matriz. (El argumento de la macro isspace() se define como un entero cuyo valor puede caber en un char unsigned ).

Acabo de ver ctype.h en GNU libc, y aunque hay un complicado lío de macros y funciones, en algún lugar de la definición de isspace() hay una matriz que se está indexando.

Ver si isspace((unsigned char) *str) se deshace de la advertencia.

El código que publicaste no tiene ninguna matriz de subíndice, pero ese error es causado por un código como este:

 int array[256]; char c = ...; array[c] = ...; 

La array[c] líneas array[c] es muy probable que sea un error, porque el tipo char puede estar firmado o sin firmar, depende del comstackdor. Si char está firmado, entonces es posible que c sea ​​negativo, en cuyo caso el acceso a un índice de matriz negativo conduce a un comportamiento indefinido.

La solución es asegurarse de que nunca use una variable char como un índice de matriz; siempre convierta primero a un tipo sin signo y asegúrese de que su valor esté dentro del rango. Si está ejecutando en un sistema con caracteres de 8 bits (es decir, CHAR_BIT es 8), una matriz de 256 elementos siempre podrá almacenar todos los valores posibles de caracteres unsigned char , y puede omitir la verificación de límites:

 int array[256]; char c = ...; array[(unsigned char)c] = ...; // Always ok, if CHAR_BIT <= 8 

Puedes deshabilitar esta advertencia con esa bandera del comstackdor:

 -Wno-char-subscripts 

-Wchar-subcripts: advierte si un subíndice de matriz tiene tipo char

Código de ejemplo que produce la advertencia anterior.

 #include int main() { int a[10]; //or even char a[10]; char c=5; printf("%d",a[c]); //you might used like this in your code array with character subscript return 0; } 

En tu código (que no está publicado), puedes usar el subíndice char como Me gusta arriba.

Ejemplo de main que produce la advertencia -Wchar-subcripts en su código:

 int main() { char c=20; char s[c]; printf("Enter string:"); fgets(s,sizeof(s),stdin); printf("String before removal of spaces : \n%s",s); printf("%c",s[c]); //accessing s[c],array element with char subscript or else any Expression you might used this printf("test text\n"); strcpy(s,removeSpace(s)); printf("String after removal of spaces : \n%s",s); printf("test text\n"); return 0; } 

Pero no hay subíndice char, en el código que ha publicado. Probé tu código añadiendo main. No reproduje ninguna advertencia o error. Hice la comstackción con gcc -Wall -Werror file.c.

Si aún no has figurado, publica todo tu código.

Código de prueba que no produjo advertencias y errores:

 #include #include #include  //included this to use isspace char *removeSpace(char *); char *removeSpace(char *str ) { char *end; // Trim leading space while(isspace(*str)) str++; if(*str == 0) // All spaces? return str; // Trim trailing space end = str + strlen(str) - 1; while(end > str && isspace(*end)) end--; // Write new null terminator *(end+1) = 0; return str; } int main() { char s[20]; printf("Enter string:"); fgets(s,sizeof(s),stdin); printf("String before removal of spaces : \n%s",s); printf("test text\n"); strcpy(s,removeSpace(s)); printf("String after removal of spaces : \n%s",s); printf("test text\n"); return 0; }