我用strrchr得到了一些奇怪的结果。请帮帮我。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char szString[32] = "hello-world-and-everyone";
char* ptemp = NULL;
ptemp = strrchr(szString, '-');
if (ptemp == NULL)
{
printf("Invalid string\n");
return 1;
}
printf("%s\n", szString);
printf("%s\n", ptemp );
*ptemp = 0;
printf("%s\n", szString);
return 0;
}
预期结果:
hello-world-and-everyone
-everyone
hello-world-and-everyone
结果:
hello-world-and-everyone
-everyone
hello-world-and
答案 0 :(得分:4)
实际结果是正确的(实际上这应该不足为奇)。
前两行输出符合您的期望,所以我认为您很了解它们。以下是最后两行中发生的事情:第一行(赋值)null - 终止最后一个破折号位置的szString
:
*ptemp = 0; // Replaces the last dash '-' with '\0'
所以字符串变为
h e l l o - w o r l d - a n d \0 e v e r y o n e \0
现在打印时,printf
找到第一个终结符,然后停在那里。这就是为什么你在输出中看到截断的字符串而不是原始的字符串。
答案 1 :(得分:3)
strrchr
返回-
中szString
最后一次出现的指针。
下面:
*ptemp = 0;
您将其指向的值设置为0
(NULL
),替换-
。因此,当您打印szString
时,它现在就结束了,因为字符串是使用0
终止的。
将其更改为:
*ptemp = 65; // ASCII 'A'
你的输出将是:
您好,世界和大家
-everyone
你好-世界andAeveryone
答案 2 :(得分:1)
strrchr
不会分配并复制到新字符串中。它返回指向给定字符所在的现有字符串的指针。所以,当你这样做时:
*ptemp = 0;
您将原始字符串中该位置的字符设置为NULL(0)。最后得到:
hello-world-and
答案 3 :(得分:1)
C中的字符串是零终止,这意味着值为0的字符标记字符串的结尾。当您执行*ptemp = 0
时,您在找到的字符串的开头插入了这样的字符,现在是原始字符串的结尾。
也许您打算通过执行ptemp = 0
(无*
)来取消指针?