【问题标题】:counting sort program showing error in specific compilers in c计数排序程序在 c 中的特定编译器中显示错误
【发布时间】:2016-11-16 02:31:09
【问题描述】:

我尝试计数排序并遵守“http://www.tutorialspoint.com/compile_c_online.php”并且它运行完美但是当我尝试在“http://codepad.org”中编译时,它说分段错误。我尝试使用gdb但它没有显示任何错误。 这是代码,任何人都可以找到导致它的行。

#include<stdio.h>
int main(void)
{
long long int t;
int i=0,j,max,min,temp,pos;
scanf("%lld",&t);//enter total numbers to be sorted
long long int a[t];
while(i<t)
    {   
        scanf("%lld",&a[i]);
        if(i==0) max=min=a[i];
        else
        {
            if(a[i]>=max) max=a[i];
            if(a[i]<min) min=a[i];
        }
        ++i;
    }
temp=(max-min+1);
long long int b[temp];
for(i=0;i<t;i++) 
    for(j=min;j<=max;j++)
        {
         if(i==0) b[j-min]=0;
         if(a[i]==j) ++b[j-min];
        }
for(i=0;i<temp;i++) if(i!=0) b[i]=b[i]+b[i-1];
long long int c[t];
for(i=0;i<t;i++)
{
    for(j=0;j<temp;j++)
        {
            if(a[i]==(j+min))
                {
                    pos=(b[j]-1);
                    c[pos]=j+min;
                    --b[j];
                }
        }
}
for(j=0;j<t;j++) printf("%lld\n",c[j]);
return(0);
}

【问题讨论】:

  • 这意味着程序有未定义的行为。:)
  • 我是初学者,你能告诉我是哪一行导致的吗???
  • 在Linux环境下使用gcc编译代码,然后在valgrind下运行。如果你正在读/写你不应该读的内存,它会告诉你。
  • 为了便于阅读和理解:1) 请一致地缩进您的代码。切勿使用制表符进行缩进。建议为每个缩进级别设置 4 个空格,因为它足够宽,即使使用可变宽度字体也可以看到。在每个左大括号 '{'' 后缩进。在每个右大括号 '}' 之前取消缩进。 2) 通过空行分隔代码块(for、if、else、while、do...while、switch、case、default)。 3) 使用有意义的变量名。变量名应指明contentsusage(或更好,两者都写)
  • 请遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。

标签: c sorting counting


【解决方案1】:

键盘似乎不支持读取用户输入:

#include<stdio.h>
int main(void)
{
long long int t;
scanf("%lld",&t);//enter total numbers to be sorted
printf("%lld\n",t );
return 0;
}

生产

Output:
134513968

没有读取输入,但有一个随机数。有了这个数字,您的程序就会崩溃。这是 c++ 的solution

【讨论】:

  • 如果发布的代码检查了每次调用scanf()的返回值(不是参数值),那么它就会发现键盘不允许用户输入的问题。这只是另一个必须检查系统函数返回值是否有错误的主要示例。
【解决方案2】:

将 cmets 中列出的更改应用于问题后

以下代码结果:

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

int main(void)
{
    long long int t;
    int i=0;
    long long int j;
    long long int max;
    long long int min;
    long long int temp;
    long long int pos;

    printf( "%s", "enter total numbers to be sorted" );
    if( 1 != scanf("%lld",&t) )
    {
        printf("%s\n","first scanf failed");
        exit( EXIT_FAILURE );
    }

    long long int a[t];

    for(i=0; i<t; i++)
    {
        printf( "%s %d", "enter number: ", i );
        if( 1 != scanf("%lld",&a[i]) )
        {
            printf( "%s\n", "second scanf failed" );
            exit( EXIT_FAILURE);
        }

        if(i==0)
        {
           max=min=a[i];
        }

        else
        {
            if(a[i]>=max)
            {
                max=a[i];
            }

            if(a[i]<min)
            {
                min=a[i];
            }
        }
    }

    temp=(max-min+1);

    long long int b[temp];

    for(i=0;i<t;i++)
    {
        for(j=min;j<=max;j++)
        {
             if(i==0)
             {
                 b[j-min]=0;
             }

             if(a[i]==j)
             {
                 ++b[j-min];
             }
        }
    }

    for(i=0;i<temp;i++)
    {
        if(i!=0)
        {
            b[i]=b[i]+b[i-1];
        }
    }

    long long int c[t];

    for(i=0;i<t;i++)
    {
        for(j=0;j<temp;j++)
        {
            if(a[i]==(j+min))
            {
                pos=(b[j]-1);
                c[pos]=j+min;
                --b[j];
            }
        }
    }

    for(j=0;j<t;j++)
    {
        printf("%lld\n",c[j]);
    }


    return(0);
}

注意:最好使用perror() 而不是printf() 来输出错误消息,但是由于调用sys_dup(),codepad 将无法编译代码

输出是:

enter total numbers to be sorted
first scanf failed

【讨论】:

  • 注意:在本地计算机而不是网页上运行时,它可以正常工作
  • 为了避免将来出现此类问题,我建议使用:http://ideone.com/,它允许您“预定义”所有用户输入
  • 我应该使用 getchar 获取数字然后将其传输到所需的变量,如果在这种情况下 scanf 显示错误???
  • 问题的根源不是发布的代码,而是正在使用的网页不允许用户输入。因此,堆栈中变量位置的垃圾就是正在使用的东西。
猜你喜欢
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多