0

我正在查看一些现有代码并添加了一些 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

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

4

5 回答 5

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
于 2012-04-15T16:49:56.417 回答
2

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

这是 cp 之前的样子:

=测试
^^^^^^^^

这是之后

 测试
^^^^^^^^

您只覆盖了第一个字符。

于 2012-04-15T16:49:21.730 回答
2

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

于 2012-04-15T16:50:08.607 回答
2

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

于 2012-04-15T16:50:34.720 回答
2

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

它之后的任何内容都不受它的影响,因此这是在拆分字符串时避免分配更多内存的好方法,因为您可以将分隔符替换为\0然后使用指向字符串开头的原始指针来获取第一部分,并sep + 1获得第二部分。

于 2012-04-15T16:51:18.910 回答