请帮我在我的代码中找到Bug(分段错误)

时间:2013-10-28 15:20:50

标签: c coding-style segmentation-fault runtime-error

我想解决这个http://www.spoj.com/problems/LEXISORT/问题 它在visual studio编译器和IDEone中运行良好,但是当我在SPOJ编译器中运行时,它正在获得SEGSIGV错误

我的代码在这里

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

char *getString();
void lexisort(char **str,int num);
void countsort(char **str,int i,int num);
int main()
{
    int num_test;
    int num_strings;
    char **str;
    int i,j;
    scanf("%d",&num_test);
    for(i=0;i<num_test;i++)
    {
           scanf("%d",&num_strings);
       str=(char **)malloc(sizeof(char *)*num_strings);
       for(j=0;j<num_strings;j++)
       {
           str[j]=(char *)malloc(sizeof(char)*11);
           scanf("%s",str[j]);
           }
      lexisort(str,num_strings);
       for(j=0;j<num_strings;j++)
       {
           printf("%s\n",str[j]);
           free(str[j]);
       }
       free(str);
    }
    return 0;
}


void lexisort(char **str,int num)
{
   int i;
   for(i=9;i>=0;i--)
   {
       countsort(str,i,num);
   }
}
void countsort(char **str,int i,int num)
{

    int buff[52]={0,0},k,x;
    char **temp=(char **)malloc(sizeof(char *)*num);
    for(k=0;k<52;k++)
    {
       buff[k]=0;
    }
    for(k=0;k<num;k++)
    {
        if(str[k][i]>='A' && str[k][i]<='Z')
        {
            buff[(str[k][i]-'A')]++;
        }
        else
        {
            buff[26+(str[k][i]-'a')]++;
        }
    }
    for(k=1;k<52;k++)
    {
        buff[k]=buff[k]+buff[k-1];
    }
    for(k=num-1;k>=0;k--)
    {
        if(str[k][i]>='A' && str[k][i]<='Z')
        {

            x=buff[(str[k][i]-'A')];
            temp[x-1]=str[k];
            buff[(str[k][i]-'A')]--;
        }
        else
        {
            x=buff[26+(str[k][i]-'a')];
               temp[x-1]=str[k];
            buff[26+(str[k][i]-'a')]--;
                }
    }
    for(k=0;k<num;k++)
    {
       str[k]=temp[k];
    }
    free(temp);
}

1 个答案:

答案 0 :(得分:0)

一般来说,这些在线判断程序给出了一个示例输入(在这种情况下,输入似乎完美地工作),但也使用一组更难的隐藏输入。

在这种情况下,如果输入字符串中有空格会发生什么?例如,输入:

1
2
hello orld
whateverss

在这种情况下,您的scanf("%s",str[j]);将无法正确读取该输入行。我建议切换到getline样式界面,而不是scanf样式界面。