我正在尝试使用帮助函数下方的帮助删除前导/尾随空白字符。 编译时我收到警告:数组下标有'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;
}
答案 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;
}