代码之家  ›  专栏  ›  技术社区  ›  Andrew-Dufresne

char*数组应以\0'或\0'结尾?

  •  14
  • Andrew-Dufresne  · 技术社区  · 16 年前

    假设我们有一个char指针数组

    char* array[] = { "abc", "def" };
    

    那么,最后应该放什么呢?

    char* array[] = { "abc", "def", '\0' };
    

    char* array[] = { "abc", "def", "\0" };
    

    不过,两种方法都有效。我们只需要根据情况来检查结局

    喜欢

    array[ index ] != '\0';
    

    array[ index ] != "\0";
    

    我的问题是哪一个更好?大多数程序员使用哪个?

    编辑

    大多数答案都说“空”比“0”和“0”更好。 但我一直认为

    空值与'\0'相同,后者与0x0或0相同

    这是错的吗?

    6 回复  |  直到 16 年前
        1
  •  27
  •   Chris Lutz    16 年前

    我会以 NULL . 为什么?因为你不能这样做:

    array[index] == '\0'
    array[index] == "\0"
    

    第一个是比较 char * 到A char ,这就是 你想要什么。你必须这样做:

    array[index][0] == '\0'
    

    第二个甚至都不行。你在比较 字符* 到A 烧焦* 是的,但是这个比较没有意义。如果两个指针指向同一块内存,则会通过。你不能用 == 要比较两个字符串,必须使用 strcmp() 函数,因为除了一些(我的意思是很少)语法细节之外,C没有对字符串的内置支持。鉴于:

    array[index] == NULL
    

    工作很好,传达了你的观点。

        2
  •  7
  •   Christoph    16 年前

    根据C99规范,

    • NULL 扩展为空指针常量,这不是必需的,但通常是类型 void *
    • '\0' 是字符常量;字符常量的类型为 int 所以它相当于平原 0
    • "\0" 是以空结尾的字符串文本,等效于复合文本 (char [2]){ 0, 0 }

    无效的 , ‘0’ 0 都是空指针常量,因此它们在转换时都会产生空指针,而 “0” 生成非空值 char * (应视为 const 因为修改是未定义的);由于此指针对于文本的每次出现都可能是不同的,所以它不能用作sentinel值。

    尽管可以使用任何整数常量值表达式 作为空指针常量(例如 ‘0’ sizeof foo - sizeof foo + (int)0.0 )您应该使用 无效的 明确你的意图。

        3
  •  6
  •   Martin v. Löwis    16 年前

    在这两者中,第一个是类型错误:“\0”是字符,而不是指针。编译器仍然接受它,因为它可以将其转换为指针。

    第二个“工作”只是巧合。\ 0”是两个字符的字符串文字。如果这些代码出现在源文件的多个位置上,编译器可能(但不需要)使它们相同。

    所以写第一个的正确方法是

    char* array[] = { "abc", "def", NULL };
    

    你测试 array[index]==NULL . 第二个测试的正确方法是 array[index][0]=='\0' ;您也可以将'\0'放在字符串中(即拼写为 "" )因为它已经包含了一个空字节。

        4
  •  1
  •   Community Mohan Dere    9 年前

    嗯,从技术上讲 '\0' 是一个角色,而 "\0" 是一个字符串,因此如果要检查空终止字符,则前者是正确的。然而,作为 Chris Lutz points out in his answer ,您的比较在当前表单中不起作用。

        5
  •  0
  •   newacct    16 年前

    以空字符结束一个字符数组只是一个专门针对C中字符串的约定。您处理的是完全不同的东西——一个字符指针数组——因此它实际上与C字符串的约定没有关系。当然,可以选择使用空指针终止它;这可能是指针数组的约定。还有其他方法可以做到。你不能问人们它“应该”如何工作,因为你假设没有什么惯例。

        6
  •  0
  •   Alan    16 年前

    空终止是一种糟糕的设计模式,最好留在历史书中。C弦后面仍然有大量的惯性,所以在那里是无法避免的。但是没有理由在OP的例子中使用它。

    不要使用任何终止符,并使用sizeof(array)/sizeof(array[0])来获取元素数。