数组下标的类型为“char”[-Wchar-subscripts]

时间:2013-08-29 04:25:25

标签: c

我正在尝试使用帮助函数下方的帮助删除前导/尾随空白字符。 编译时我收到警告:数组下标有'char'类型[-Wchar-subscripts] 如何摆脱这个消息。

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

4 个答案:

答案 0 :(得分:13)

警告可能是因为您将char传递给isspace()宏。 isspace()的实现可以通过数组索引。 (isspace()宏的参数定义为整数,其值可以包含在 unsigned char

我刚看过GNU libc中的ctype.h,虽然有一堆复杂的宏和函数,但在isspace()的定义中,有一个数组被索引。

查看isspace((unsigned char) *str)是否删除了警告。

答案 1 :(得分:7)

您发布的代码根本没有任何数组下标,但该错误是由以下代码引起的:

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

array[c]很可能是一个错误,因为类型char可以是签名的或未签名的 - 它取决于编译器。如果char已签名,则c可能为否定,在这种情况下,访问负数组索引会导致未定义的行为。

修复方法是确保永远不要将char变量用作数组索引 - 始终先将其转换为无符号类型,并始终确保您的值在范围内。如果您在具有8位char的系统上运行(即CHAR_BIT为8),那么256个元素的数组将始终能够存储所有可能的unsigned char值,您可以省略边界检查:

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

答案 2 :(得分:2)

您可以使用该编译器标志禁用此警告:

-Wno-char-subscripts

答案 3 :(得分:0)

-Wchar-subscripts:如果数组下标的类型为char

,则发出警告

产生上述警告的示例代码。

#include<stdio.h>
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;
} 

在您的代码中(未发布),您可能使用上面的字母As Like。

在代码中生成-Wchar-subscripts警告的main示例:

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

但是你发布的代码中没有char下标。通过添加main来测试您的代码。没有重现任何警告或错误。我使用 gcc -Wall -Werror file.c 编译。

如果你还没有想到,请发布你的整个代码。

测试代码没有产生任何警告和错误:

#include<stdio.h>
#include<string.h>
#include <ctype.h> //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;
}