程序做了应该做的事情,提取字符串中最后一次出现的字符串,但是由于
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 代码,而不是 C++ 代码。它包含可用于指针算术的典型错误,并包含可能的缓冲区溢出。
s
是指向数组开头的指针,strstr
返回指向找到的事件或 nullptr
的指针。所以你的代码有两个可能的错误:
nullptr - s
没有定义的结果。k
比 strlen(s)
更大 - 第二次调用 strstr 会这样。