我有一个函数,它应该读取一个字符串(只有数字),并返回最重要的序列,重复数字。 例如: 12345267890
它应该返回:345267890
我手动试验了代码,我相信它应该可行。但是当我运行它时,当它到达这条线i=(strchr(v+i, *(v+j)))-v;
而不是获得指针之间的距离时,我会得到像-1046583这样的东西。我可以这样做吗?
char* bigSeq(char *v){
int i, j;
char *aux, *bgst;
aux=(char*) malloc(10*sizeof(char));
bgst=(char*) malloc(10*sizeof(char));
for(i=0;i<strlen(v);i++){
for(j=0;j<strlen(v+i);j++){
if(strchr(v+i, *(v+j)) != (v+j)){
if(strlen(strncpy(aux, (v+i),j)) > strlen(bgst))
strncpy(bgst, (v+i),j);
i=(strchr(v+i, *(v+j)))-v;
break;
}
}
}
return bgst;
}
答案 0 :(得分:3)
我认为你的麻烦在于strchr()
以及当它找不到你要搜索的角色时它会返回什么。在这种情况下,它返回0,而不是传递给它的字符串的开头或结尾。
您还应该检查输入是否为“const char *
”,并查看为什么需要在两个循环的每次迭代中调用strlen()
。你可以做得更好。
请注意,如果非重复数字的最长子字符串全部为10位,则分配的空间太小 - 您需要在字符串末尾为NUL '\0'
分配一个字节。此外,strncpy()
不保证空字符串终止;我不确定这是否是你问题的一部分。
答案 1 :(得分:1)
if(strlen(strncpy(aux, (v+i),j))
和
strncpy(bgst, (v+i),j);
如果j
是> 10
你覆盖了你不拥有的记忆 - 这会导致各种有趣的问题。
答案 2 :(得分:0)
我将建议一个O(N)算法,它也更简单,更容易阅读,并且除了堆栈上的几个指针和整数之外不需要额外的内存。这些功能有助于消除错误的可能性。
void longest_non_repeating( const char** output_begin, const char** output_end, const char* input )
{
const char* last_occurrence[10] = { input-1 };
const char* candidate_begin = input;
while( *input )
{
if( last_occurrence[*input-'0'] < candidate_begin )
{
const char* candidate_end = input+1;
if( candidate_end - candidate_begin > *output_end - *output_begin )
{
*output_begin = candidate_begin;
*output_end = candidate_end;
if( ( candidate_end - candidate_begin ) == 10 )
return;
}
}
else
{
input = candidate_begin = last_occurrence[*input-'0'] + 1;
std::fill( last_occurrence, last_occurrence+10, input-1 );
}
last_occurrence[*input-'0'] = input;
++input;
}
}