0

我正在尝试解决这个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);
}
4

1 回答 1

0

一般来说,这些在线判断程序会给出一个示例输入(在这种情况下,该输入看起来工作得很好),但也使用了一组更难隐藏的输入。

在这种情况下,如果输入字符串中有空格会怎样?例如,输入:

1
2
hello orld
whateverss

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

于 2013-10-28T15:50:15.467 回答