gpt4 book ai didi

c - 打印错误值的字符串数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:34 24 4
gpt4 key购买 nike

我试图编写一个程序来计算正确的前缀和正确的后缀,然后比较集合,然后返回包含代表匹配数量的值的数组对,这可以在后面的 KMP 算法中使用。但问题是前缀和后缀数组给出了错误的值。即使在新索引处附加了一个新元素之后,它也会用新元素替换数组中的所有值。

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

int* lps(char *,int );

int main()
{

char *pat = "abababca";

int *ptr ;
ptr = lps(pat,strlen(pat));

printf("\n***LPS***\n");


}

int * lps (char *p,int s)
{


char *prefixes[s] ;
char *suffixes[s] ;
char tmp1[s] , tmp2[s];
int i , j , k , c1 , c2 , c;

for (i = 0 ; i < s ; i ++)
{
printf("\n\n*** --- Creating Prefixes and Suffixes for i = %d --- ***",i);

c1 = 0 ;
//create prefixes
for (j = 0 ; j < i; j++)
{
for (k =0 ; k <= j; k++)
{
tmp1[k]=*(p+k);
printf("\n *(p+%d)= %c , tmp1[%d]=%c",k,*(p+k),k,tmp1[k]);
}

tmp1[k]='\0';
printf("\nprefixes[0]:%s",prefixes[0]);
prefixes[c1] = tmp1;
//strcpy(prefixes[c1], tmp1);

printf("\ncurrently added %s to prefixes at %d and prefixes[%d]= %s\n ",tmp1,c1,c1,prefixes[c1]);
c1++;
}

//print prefixes
for (k = 0; k<c1; k++)
{
printf("\tprefixes[%d] = %s",k,prefixes[k]);
}
printf("\n");



//create suffixes
c2 = 0;
for (j = 1 ; j <= i; j++)
{
for (k = j ; k <= i; k++)
{
tmp2[k-j] = *((p+k));
printf("\n *(p+%d)= %c , tmp2[%d]=%c",k,*(p+k),k-j,tmp2[k-j]);
}

tmp2[k-j]='\0';
suffixes[c2] = tmp2 ;
// strcpy(suffixes[c2], tmp2);

printf("\ncurrently added %s to suffixes at %d and suffixes[%d]= %s\n",tmp2,c2,c2,suffixes[c2]);
c2++;
}

//prinf suffixes
for (k = 0; k<c2; k++)
{
printf("\tsuffixes[%d] = %s",k,suffixes[k]);
}
printf("\n");
//compare the prefixes and suffixes

c = 0 ;
for (j = 0; j < c1; j++)
{
for(k=0 ; k < c2 ; k++)
{
printf("\nprefixes[%d] = %s , suffixes[%d] = %s\n ",j,prefixes[j],k,suffixes[k]);

if (strcmp(prefixes[j], suffixes[k])==0)
{
c = c + 1 ;
}
}
}

}
}

输出(输出的一部分):-

prefixes[0] = ab    prefixes[1] = ab   //it should be prefixes[0] = a   prefixes[1] = ab

最佳答案

问题是您没有分配任何字符串。 lps 中仅有的字符串是 tmp1tmp2。然后你像这样分配:

prefixes[c1] = tmp1;

分配一个指针但不复制字符串的内容。 prefixes 中的每个条目最终都会指向相同的字符串 tmp1。对于 suffixes 也是如此。

您需要使用 mallocstrcpy 来创建新的字符串实例。

在代码中,您已经注释掉了对 strcpy 的调用。我怀疑您尝试了这些并遇到了运行时错误。那些运行时错误是因为您没有分配任何内存。更正后的代码如下所示:

prefixes[c1] = malloc(strlen(tmp1)+1);
strcpy(prefixes[c1], tmp1);

对于后缀也是如此。

在生产质量代码中,您将包括错误检查。并且您要确保在调用 malloc() 返回的任何指针上调用 free(),一旦您完成它。

我还会质疑 C 可变长度数组 VLA 的使用。在您的代码中,prefixessuffixestmp1tmp2 都是 VLA。如果数组维度很大,使用 VLA 很容易导致堆栈溢出。我的直觉告诉你这里需要堆分配。

关于c - 打印错误值的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15717592/

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