void Next(char*T,int *next){ next[1]=0; next[2]=1; int i=2; int j=1; while (i<strlen(T)) { if (j==0||T[i-1]==T[j-1]) { i++; j++; next[i]=j; }else{ j=next[j]; } } } int main(int argc, char* argv[]) { char ss[] = "ababc"; int next[5] = {0}; cout << strlen(ss) << endl; Next(ss, next); cout << strlen(ss) << endl; return 0; } 为啥第一处strlen(ss)的结果是5,但第二处strlen(ss)的结果却是0
时间: 2024-04-17 07:26:05 浏览: 93
在给定的代码中,第一处的`strlen(ss)`结果是5,而第二处的`strlen(ss)`结果是0。这是因为在调用Next函数后,ss数组中的字符串被修改,导致没有以空字符 '\0' 结尾。
在Next函数中,通过对next数组的赋值操作,实际上修改了ss数组中的内容。这是因为ss和next数组在内存中是连续存储的,所以next数组的赋值操作会影响到ss数组。
在代码执行完Next函数后,ss数组没有以空字符结尾,因此strlen函数无法正确计算字符串的长度,返回值为0。
要解决这个问题,你可以在Next函数执行完后,手动将ss数组的最后一个元素赋值为空字符 '\0'。例如,在Next函数的最后添加一行代码`T[i] = '\0';`,即可正确地以空字符结尾。
修改后的代码如下所示:
```cpp
void Next(char*T,int *next){
next[1]=0;
next[2]=1;
int i=2;
int j=1;
while (i<strlen(T)) {
if (j==0||T[i-1]==T[j-1]) {
i++;
j++;
next[i]=j;
}else{
j=next[j];
}
}
T[i] = '\0';
}
int main(int argc, char* argv[])
{
char ss[] = "ababc";
int next[5] = {0};
cout << strlen(ss) << endl;
Next(ss, next);
cout << strlen(ss) << endl;
return 0;
}
```
这样修改后,第一处的`strlen(ss)`结果仍然是5,而第二处的`strlen(ss)`结果将会正确地返回6。
阅读全文