回 帖 发 新 帖 刷新版面

主题:大家来看看我这个程序为什么会崩溃

输入:
    输入分为两部分,第一部分建立数据库,第二部分进行询问。数据库的格式为,第一行为数据库大小N,接下来的N行为具体的数据,每行一个数据。数据库的建立由连续3个“#”标识结束。询问的格式,第一行为询问的次数K,接下来的K行为“询问的是第几个数字”。
    输出:
    从小到大,按值排序的第X个数字。

    测试样例:
样例输入
5
7
121
123
7
121
###
4
3
3
2
5

样例输出
121
121
7
123
程序如下
#include<stdio.h>
#include<string.h>
FILE *fp_in=NULL;
FILE *fp_out=NULL;
int init()/*分别以读、写方式打开文件bonus_in,bonus_out*/ 
{
    
        fp_in=fopen("bonus_in.txt","r");
    if(fp_in==NULL)
    {
        return -1;
    }
    fp_out=fopen("bonus_out.txt","w");
    if(fp_out==NULL)
    {
        return -1;
    }
}
void destroy()/*关闭输入输出文件*/ 
{
    fclose(fp_in);
    fclose(fp_out);
}


int main()
{
    int i,j,k,t,M,N,a[100],b[100];//定义数据库大小N,访问次数M
    char *str="###",*s;
    init();
    fscanf(fp_in,"%d",&N);
    for(i=0;i<N;i++)
    fscanf(fp_in,"%d",&a[i]);
    for(j=0;j<N;j++)
        for(i=0;i<N-j;i++)
                if(a[i]>=a[i+1])
                {
                    t=a[i];
                    a[i]=a[i+1];
                    a[i+1]=t;
                }
    fscanf(fp_in,"%s",s);
    if(strcmp(str,s)==0)
    {
        
        fscanf(fp_in,"%d",&M);
        for(k=0;k<M;k++)
            fscanf(fp_in,"%d",b[k]);
    }
    for(i=0;i<M;i++)
            fprintf(fp_out,"%d",a[b[k]-1]);
        destroy();
        
}







        

回复列表 (共2个回复)

沙发

楼主,您的代码有几个小问题,您在编译的时候最好打开所有警告信息,有很多错误一看警告就能修改了的。

下面是我在您的代码基础上稍微修改了下:
[code=c]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define func() printf("\n%s:%d ", __func__, __LINE__)

FILE *fp_in  = NULL;
FILE *fp_out = NULL;

int init()/*分别以读、写方式打开文件bonus_in,bonus_out*/ 
{
    fp_in = fopen ("bonus_in.txt", "r");
    if(fp_in == NULL)
       return -1;
    
    fp_out = fopen ("bonus_out.txt", "w");
    if(fp_out == NULL)
      return -1;
    
  return 0;
}
void destroy()/*关闭输入输出文件*/ 
{
    fclose(fp_in);
    fclose(fp_out);
}


int main()
{
    int i, j, k = 0, t, M, N;//定义数据库大小N,访问次数M
    int a[100], b[100];
    /* 这里有改动,原来的s并没有给它分配空间,怎能fscanf (fp_in, "%s", s);这样用呢 */
    char  buf[1024], *s = buf;
    
    if (init() == -1){
        /* 打不开文件,只能退出程序咯 */ 
        fprintf (stderr, "\ncan't open file.");
        abort ();
    }
    
    fscanf(fp_in, "%d", &N);
    for(i = 0; i < N; i++)
      fscanf(fp_in, "%d", &a[i]);
      
    for(j = 0; j < N; j++){ 
                        
        for(i = 0; i < N-j; i++){
            
            if(a[i] >= a[i+1])
               {
                 t      = a[i];
                 a[i]   = a[i+1];
                 a[i+1] = t;
               }     
        }
    }   
      
    fscanf (fp_in, "%s", s);
    if (strcmp("###", s) == 0)
    {
       fscanf (fp_in, "%d", &M);
       for (k = 0; k < M; k++)
           fscanf(fp_in, "%d", &b[k]);
    }
    
   /* 这里有改动,原来为
   for(i=0;i<M;i++)
            fprintf(fp_out,"%d",a[b[k]-1]);
   如果上面的if(strcmp("###"..语句执行以后,循环以后, k 的 一直等于 M的值,
   不变,应当改为  fprintf (fp_out, "%d\n", a[ b[i] -1 ]);                    */
    for (i = 0; i < M; i++)
      fprintf (fp_out, "%d\n", a[ b[i] -1 ]);
         
    destroy ();
    return 0;        
}

[/code]

板凳

很感谢楼上的,呵呵,主要是新学,还有好多细节的地方不太懂,编起来很难意识到错误,谢谢您,我会努力改正那些毛病

我来回复

您尚未登录,请登录后再回复。点此登录或注册