C 打印错误值的字符串数组

C 打印错误值的字符串数组,c,arrays,string,C,Arrays,String,我试图制作一个程序,计算适当的前缀和后缀,然后比较这些集合,然后返回包含表示匹配数目的值的数组 对,这可以稍后在KMP算法中使用。 但问题是前缀和后缀数组给出了错误的值。 即使在新索引处追加新元素后,它也会用新元素替换数组中的所有值 #include <stdio.h> #include <string.h> #include <stdlib.h> int* lps(char *,int ); int main() { char *pat = "abab

我试图制作一个程序,计算适当的前缀和后缀,然后比较这些集合,然后返回包含表示匹配数目的值的数组 对,这可以稍后在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 ;
            }
        }
    }

  }
  }

问题是您没有分配任何字符串。
lps
中仅有的字符串是
tmp1
tmp2
。然后,您可以这样分配任务:

prefixes[c1] = tmp1;
分配指针但不复制字符串内容的。最后,
前缀中的每个条目都指向同一个字符串,
tmp1
。同样,对于
后缀

您需要使用
malloc
strcpy
创建新的字符串实例

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

prefixes[c1] = malloc(strlen(tmp1)+1);
strcpy(prefixes[c1], tmp1);
同样地,对于
后缀

在产品质量代码中,您应该包括错误检查。并且您希望确保在完成调用后,对调用
malloc()
返回的任何指针调用
free()


我还质疑C可变长度数组VLA的使用。在您的代码中,
前缀
后缀
tmp1
tmp2
都是VLA。如果阵列尺寸较大,使用VLA很容易导致堆栈溢出。我的直觉告诉我,堆分配是您在这里所需要的。

我尝试了strcpy,但它不能给出任何运行时错误,也不能解决我的问题。除非您实际分配一些内存,否则调用
strcpy
不会有帮助。先生,即使没有分配内存,那么tmp1变量是如何分配给prefixes元素的,为什么没有显示任何错误???
prefixes[c1]=tmp1
是指针分配。
前缀[]
中的每个元素都会指向同一个字符串,
tmp1
。所以看起来所有的字符串都有相同的值。事实上,只有一个字符串和许多指向它的指针这并不能解决我描述的问题。然后,所有元素都指向一个空字符串。我认为也许您没有100%地了解指向字符数组(又名字符串)的指针的工作方式。
prefixes[c1] = malloc(strlen(tmp1)+1);
strcpy(prefixes[c1], tmp1);