2

我用 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
4

4 回答 4

4

实际结果是正确的(这应该不足为奇,真的)。

前两行输出符合您的期望,因此我假设您很好地理解了它们。这是最后两行中发生的事情:第一行(赋值)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找到第一个终止符,然后停在那里。这就是为什么您会在输出中看到截断的字符串,而不是原始字符串。

于 2014-01-17T03:49:12.833 回答
3

strrchr返回指向最后一次出现的-in的指针szString

这里:

*ptemp = 0; 

您将它指向的值设置为0( NULL),替换-. 因此,当您打印szString它时,它现在就结束了,因为字符串使用0.

将其更改为:

*ptemp = 65; // ASCII 'A'

你的输出将是:

hello-world-and -
everyone

于 2014-01-17T03:48:37.700 回答
1

strrchr不分配并复制到新字符串中。它返回一个指向给定字符所在的现有字符串的指针。所以,当你这样做时:

*ptemp = 0;

您将原始字符串中该位置的字符设置为 NULL (0)。最后得到:

hello-world-and
于 2014-01-17T03:48:24.417 回答
1

C 中的字符串以零结尾,这意味着值为 0 的字符标记字符串的结尾。当您这样做时,*ptemp = 0您在找到的字符串的开头插入了这样一个字符,现在是原始字符串的结尾。

也许您打算通过执行ptemp = 0(no *) 来使指针为空?

于 2014-01-17T03:48:28.517 回答