我正在尝试this spoj问题。但我无法理解为什么它会在某些测试用例中给出分段错误。
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int getMin(char *txt,int n) {
int min = 0;
for(int i = 0 ; i < n ; i++) {
if(strcmp(txt+min ,txt+i) > 0)
min = i;
}
return min;
}
int main() {
char *s = new char[200005];
scanf("%s",s);
int n = strlen(s);
strcat(s+n,s);
printf("\n%d",getMin(s,n));
delete[] s;
return 0;
}
答案 0 :(得分:0)
来自strcat的联机帮助页:&#34;(来源和目标)字符串可能不重叠&#34;。
那么,出了什么问题? s + n是字符串s的终止空字节。所以做这样的事情:
char *strcat(char *dest, const char *src)
{
while (*dest != '0')
dest++;
while (*src != '\0')
*dest++ = *src++;
return dest;
}
在src中找不到空字节,因为它在我们到达时已被覆盖,因为这是您作为destimation字符串传递的地址。所以你的strcat函数会继续运行,直到它遇到访问冲突并且你的程序出现故障。