0

私はこれを解決しようとしています http://www.spoj.com/problems/LEXISORT/ビジュアルスタジオコンパイラと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);
}
4

1 に答える 1

0

一般的に言えば、これらのオンライン審査プログラムは入力例を提供します (この場合、その入力は完全に機能しているように見えます) が、より難しい隠された入力のセットも使用します。

この場合、入力文字列にスペースが含まれているとどうなりますか? たとえば、次の入力:

1
2
hello orld
whateverss

この場合、scanf("%s",str[j]);その入力行を正しく読み取れません。scanf スタイルのインターフェースではなく、getline スタイルのインターフェースに切り替えることをお勧めします。

于 2013-10-28T15:50:15.467 に答える