编译程序时,我一直收到此错误消息。这只是我代码的一小部分,因此如果需要,我将提供其余的代码。有关为何发生这种情况的任何想法?
void strip_quotes(char s[]) {
if (s[0]=='"') s=s+1;
if (s[strlen(s)-2]=='"') s[strlen(s)-2]=NULL;
}
答案 0 :(得分:6)
您要将s
的字符设置为NULL
。向字符串添加空字符的正确方法是使用'\0'
。
要解释该消息,NULL
可能定义为(void*)0
,因此在您指定时,您正在将void*
转换为char
,因此会发出警告。
答案 1 :(得分:5)
由于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()
(或calloc()
和realloc()
返回的指针可以传递给free()
。如果s
的值已更改,则free()
不能s
通过void strip_quotes(char s[]) {
。
请注意:
void strip_quotes(char* s) {
等同于:
{{1}}
因为代码中使用了指针而感到困惑。
答案 2 :(得分:0)
戴夫得到了它,但我会尝试添加一点。
NULL是void *类型的指针,可以将其指定给任何指针类型。如果要设置指向永远不能用于表示有效内存的值的指针,请使用NULL。
'\ 0',又名NUL,ascii值为0,用于终止字符串。它是char类型。 http://www.december.com/html/spec/ascii.html。
答案 3 :(得分:0)
void strip_quotes(char s[]) {
int len = strlen(s);
if(s[len-1] == '"')
s[--len] = '\0';
if(s[0]=='"')
memmove(s, s+1, len);
}