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