比较字符串时,以下程序是否异常终止?

时间:2017-01-30 09:58:26

标签: c string data-structures

我正在比较两个字符串数组,但程序在比较一些字符串后异常终止:

output of program

我的代码出了什么问题?

int main() 
{

    int N,Q;
    printf("Enter no. of strings:");
    scanf("%d",&N);
    char *a[N],*b[Q],k[50],*p;
    int len;

    //scanning first array of strings
    for(int i=0;i<N;i++)
    {
        scanf("%s",k);
        len=strlen(k);
        p=(char*)malloc((len+1)*sizeof(char));
        strcpy(p,k);
        a[i]=p;
    }
    printf("no. of Query:");
    scanf("%d",&Q);

    //scanning second array of strings
    for(int i=0;i<Q;i++)
    {
        scanf("%s",k);
        len=strlen(k);
        p=(char*)malloc((len+1)*sizeof(char));
        strcpy(p,k);
        b[i]=p;
    }

    ***//comparing both the arrays of strings***
    for(int i=0;i<Q;i++)
    {
        for(int j=0;j<N;j++)
        {
            int i=strcmp(a[j],b[i]);
            printf("%d\t",i);
        }
        printf("\n");
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

将strcmp的结果分配到不同的变量名称而不是&#39; i&#39; 因为&#34; i&#34;是你的外部循环变量,但是b[i]的i在堆栈中

for(int i=0;i<Q;i++)
{
    for(int j=0;j<N;j++)
    {
        int i=strcmp(a[j],b[i]); 
        printf("%d\t",i);
    }
    printf("\n");
}

答案 1 :(得分:3)

在初始化b[Q] Q的声明时,任何事情都可能在此之后发生。在您指定b[]之前,您至少需要移动Q的声明。

可能还有其他问题 - 这只是显而易见的问题。

答案 2 :(得分:1)

您正在输入字符串的数量而未正确使用它。您应该使用动态内存分配。使用 malloc

printf("Enter no. of strings:");
scanf("%d",&N);

char *a[N]

应该在哪里

a = malloc(sizeof(char*) * N);

并在返回前释放它以避免记忆韭菜。 I am not sure that this is the problem but this can be a step in the right direction.

基于@Clifford评论编辑:C99标准允许这样做,如果您的编译器支持C99,这不是问题。