gpt4 book ai didi

C: 查找最长重复子串时出现 strcmp 错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:45:32 27 4
gpt4 key购买 nike

我正在尝试创建一个返回最长重复子字符串的程序。我几乎已经找到了解决方案,但是由于某种原因,我的 strcmp 在他忙于寻找 LRS 时出错。有人可以向我解释为什么会出现错误以及我如何解决这个问题吗?

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NSTRINGS 4

char* searchLongestRepeatedSubstring(char* string);
char** makeSuffixArray(char* string);
void freeSuffixArray(char** suffixArray);
int cmp(const void*a, const void* b);

/* do not change this code */
int main(void)
{
char* strings[NSTRINGS] = {
"bananas",
"ask not what your country can do for you, but what you can do for your country",
"main",
"" };
char* result;

for (int i = 0; i < NSTRINGS; ++i)
{
result = searchLongestRepeatedSubstring(strings[i]);
if (result != NULL)
{
/* write out LRS */
printf("%s: \"%s\"\n", strings[i], result);

/* free() the result */
free(result);
result = NULL;
}
else
printf("Geen longest repeated substring.\n");
}

return 0;
}

/**
* Finds the LRS from a string using the function makeSuffixArray
*
* @param the given string
* @return the longest repeated substring
*/
char* searchLongestRepeatedSubstring(char* string)
{

char **p;
p = makeSuffixArray(string);
size_t length = strlen(string);
int max_sz = 0;
char max_word;
int curr_sz = 0;
int curr_word;
char* word1;
char* word2;
char s1, s2;
size_t length1;
size_t length2;

for (size_t i = 0; i < length; i++)
{
for (size_t j = i + 1; j < length; j++)
{
word1 = p[i];
word2 = p[j];
length1 = strlen(word1);
length2 = strlen(word1);
for (size_t x = 0; x < length1; x++)
{
s1 = word1[x];
for (size_t y = 0; y < length2; y++)
{
s2 = word2[y];
if (strcmp(s1, s2) == 0) {
curr_sz++;
strcat(curr_word, s1);
x++;
}
else
break;
}
}
if (curr_sz > max_sz) {
max_sz = curr_sz;
curr_sz = 0;
max_word = curr_word;
curr_word = "";
}
else {
curr_sz = 0;
curr_word = "";
}
}
}
return max_word;
}

/**
* Creates the suffix array of the given string
*
* @param the given string
* @return the suffix array
*/
char** makeSuffixArray(char* string)
{
size_t length = strlen(string);
char **p = (char**)malloc(length * sizeof(char*));
for (size_t i = 0; i < strlen(string); i++)
{
p[i] = &string[i];
puts(p[i]);
}
qsort(p, length, sizeof(char*), cmp);
return p;
}


int cmp(const void* a, const void* b)
{
char ** p = (char**)a;
char ** t = (char**)b;

return strcmp(*p, *t);
}

/**
* free() the memory allocated for the suffix array
*
* @param the given suffix array
*/
void freeSuffixArray(char** suffixArray)
{
free(suffixArray);
}

最佳答案

在你的函数中 char* searchLongestRepeatedSubstring-

 if (strcmp(s1, s2) == 0) {

s1s2 都是 char 变量,您将它们传递给期望 strcmp const char * 作为参数,因此,您的编译器投诉

你可以这样比较它们-

if(s1==s2)

此语句也在同一 if block 中 -

strcat(curr_word, s1);

相反,你可以这样做 -

size_t len=strlen(curr_word);
curr_word[len]=s1; // make sure curr_word is large enough
curr_word[len+1]='\0';

关于C: 查找最长重复子串时出现 strcmp 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com