0

编译我的程序时,我不断收到此错误。这只是我代码的一小部分,因此如果需要,我将提供其余代码。关于为什么会发生这种情况的任何想法?

void strip_quotes(char s[]) {
   if (s[0]=='"') s=s+1;
   if (s[strlen(s)-2]=='"') s[strlen(s)-2]=NULL;
}
4

4 回答 4

6

您正在设置sto的字符NULL。将空字符添加到字符串的正确方法是使用'\0'.

为了解释该消息,NULL可能定义为(void*)0,因此当您分配它时,您正在转换void*char,因此是警告。

于 2013-05-19T08:37:32.340 回答
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()使用(或其他一些复制机制)将数组的内容向左移动
  • 传递指针的地址 (a char**)
  • 返回一个指向s

更改 的内容s是可取的,因为如果数组是动态分配的,它可以避免可能出现的问题:只有malloc()(orcalloc()realloc()) 返回的指针可以传递给free(). 如果 的值s被改变,那么它不能通过free()d s

注意:

void strip_quotes(char s[]) {

等效:

void strip_quotes(char* s) {

以防您对代码中使用了指针感到困惑。

于 2013-05-19T08:45:24.567 回答
0

戴夫明白了,但我会尝试添加一点。

NULL 是 void* 类型的指针,可以分配给任何指针类型。如果要设置一个指向永远不能用来表示有效内存的值的指针,请使用 NULL。

'\0',又名 NUL,是 ascii 值 0,用于终止字符串。它是 char 类型。 http://www.december.com/html/spec/ascii.html

于 2013-05-19T08:42:33.567 回答
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);
}
于 2013-05-19T08:44:32.623 回答