编译我的程序时,我不断收到此错误。这只是我代码的一小部分,因此如果需要,我将提供其余代码。关于为什么会发生这种情况的任何想法?
void strip_quotes(char s[]) {
if (s[0]=='"') s=s+1;
if (s[strlen(s)-2]=='"') s[strlen(s)-2]=NULL;
}
您正在设置s
to的字符NULL
。将空字符添加到字符串的正确方法是使用'\0'
.
为了解释该消息,NULL
可能定义为(void*)0
,因此当您分配它时,您正在转换void*
为char
,因此是警告。
正如Dave已经正确指出了编译器错误的原因:
s[strlen(s)-2]=NULL; /* = (void*)0 */
代码中还有一个不会导致编译器错误的错误:
if (s[0]=='"') s=s+1;
的增量对s
调用者是不可见的,因为 C 通过包括指针的值传递(参见http://c-faq.com/ptrs/passptrinit.html)。校正选项:
memmove()
使用(或其他一些复制机制)将数组的内容向左移动char**
)s
更改 的内容s
是可取的,因为如果数组是动态分配的,它可以避免可能出现的问题:只有malloc()
(orcalloc()
和realloc()
) 返回的指针可以传递给free()
. 如果 的值s
被改变,那么它不能通过free()
d s
。
注意:
void strip_quotes(char s[]) {
等效:
void strip_quotes(char* s) {
以防您对代码中使用了指针感到困惑。
戴夫明白了,但我会尝试添加一点。
NULL 是 void* 类型的指针,可以分配给任何指针类型。如果要设置一个指向永远不能用来表示有效内存的值的指针,请使用 NULL。
'\0',又名 NUL,是 ascii 值 0,用于终止字符串。它是 char 类型。 http://www.december.com/html/spec/ascii.html。
void strip_quotes(char s[]) {
int len = strlen(s);
if(s[len-1] == '"')
s[--len] = '\0';
if(s[0]=='"')
memmove(s, s+1, len);
}