将字符串设置为'\ 0'

时间:2012-04-15 16:47:54

标签: c

我正在查看一些现有代码并添加了一些printf行。有一个字符串cp“TZ = test”

cp = strchr(str, '=');
printf("Text: %s\n",cp);
printf("Text cp+1: %s\n",cp+1);
*cp = '\0';
printf("Text: %s\n",cp);
printf("Text cp+1: %s\n",cp+1);

输出是:

Text: =test
Text c+1: test
Text:
Text c+1: test

我理解前两个测试,但为什么第四个测试打印“测试”,即使* cp之前设置为'\ 0'?

5 个答案:

答案 0 :(得分:3)

与其他语言不同,C不知道字符串是什么,它只知道它的结束位置,所以它从你给它的指针打印出来。

    [=test\0]
1:   ^start here
          ^ end at \0
2:    ^start here
          ^ end at \0

    [\0test\0]
3:   ^start here, it's \0, so stop
4:     ^start here
           ^ end at \0

答案 1 :(得分:2)

因为您正在打印* cp + 1。

以下是cp之前的样子:

=测试
^^^^^^^^

,此后是

测试
^^^^^^^^

你只是覆盖了第一个角色。

答案 2 :(得分:2)

cp[0]设置为'\ 0'无关紧要。您正在打印仍在“测试”的cp+1

答案 3 :(得分:2)

因为您只是将字符串的第一个字符设置为\0。其余的记忆都没有动过。因此,*cp + 1的打印将从Test开始打印,而不是从\0Test打印。

答案 4 :(得分:2)

将字符设置为\0将在此时终止字符串,因为\0是C中的字符串结束字符。

之后的任何内容都不会受到影响,因此在分割字符串时避免分配更多内存是一种很好的方法,因为你可以用\0替换分隔符,然后使用原始指针开始获取第一部分的字符串,以及获取第二部分的sep + 1