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}; Next(ss, next); cout << strlen(ss) << endl; return 0; } 上述代码中,为啥strlen(ss)的值是0
时间: 2024-04-17 08:28:28 浏览: 22
在上述代码中,strlen(ss)的值为0是因为在调用Next函数之前,数组ss没有以空字符 '\0' 结尾。
strlen函数用于计算字符串的长度,它从字符串的起始位置开始计算,直到遇到空字符 '\0' 为止。在该代码中,由于ss数组没有以空字符结尾,strlen函数无法正确计算字符串的长度,因此返回值0。
要修复这个问题,你可以在定义ss数组时,显式地添加一个空字符 '\0' 作为字符串的结尾。例如,将`char ss[] = "ababc";`修改为`char ss[] = "ababc\0";`。这样,strlen(ss)将会返回6,正确地计算出字符串的长度。
相关问题
void getNext(char* p, int* next)
这个函数是一个实现 KMP 字符串匹配算法中“求解 next 数组”的函数。其中,参数 p 是要匹配的模式串,next 数组记录了模式串每一位匹配失败时跳转的位置。
具体来说,算法从模式串的第一位开始,维护两个指针 i 和 j,表示当前匹配的位置和已知的部分匹配位置。如果当前位置和已知位置匹配,则两个指针同时向右移动一位,并将 next[i+1] 赋值为 j+1。如果不匹配,则将已知位置 j 向左跳转到 next[j] 所记录的位置,再次进行匹配。
最终,当 i 超过模式串的长度时,next 数组就求解完成了。
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
在给定的代码中,第一处的`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。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)