我不太明白为什么这段代码有效。特别是在“i=strstr(s + k, t) - s;”部分,根据我的理解,strstr() 返回一个指针

问题描述 投票:0回答:1

程序做了应该做的事情,提取字符串中最后一次出现的字符串,但是由于

strstr()
返回一个指针,为什么“减号字符串”要使其无符号并给出该值最后一次出现?

输入:

ana si mariana canta la nai

输出:

ana si mariana canta la i

代码如下:

#include <iostream>
#include <cstring>

using namespace std;

char s[256], t[256];
int main()
{
    unsigned i, n, k = 0, x = 0;
    gets(s);
    gets(t);
    n = strlen(t);
    while(k < strlen(s) && x < strlen(s))
    {
        i = strstr(s + k, t) - s;
        k = i + n;
        x = strstr(s + k, t) - s;
    }
    strcpy(s + i, s + i + n);
    cout << s;
    return 0;
}

我尝试将数据类型从指针更改为 unsigned 或 int,看看会发生什么,更改“s”的位置,例如“s - strstr(...)”,但代码不再起作用。

c++ pointers abstract-data-type
1个回答
0
投票

如果两个指针指向同一个数组的元素(或超出末尾的一个元素),则减法的结果是它们之间的有符号距离,以元素为单位,如果左指针指向索引更大的元素,则结果为正。

除了输出之外,这在概念上是 C 代码,而不是 C++ 代码。它包含可用于指针算术的典型错误,并包含可能的缓冲区溢出。

s
是指向数组开头的指针,
strstr
返回指向找到的事件或
nullptr
的指针。所以你的代码有两个可能的错误:

  • 未找到子字符串:
    nullptr - s
    没有定义的结果。
  • k
    strlen(s)
    更大 - 第二次调用 strstr 会这样。
© www.soinside.com 2019 - 2024. All rights reserved.