C 程序因文件格式而崩溃

C 程序因文件格式而崩溃,c,crash,C,Crash,我从usaco那里试着解决这个问题。当我使用txt文件,而使用文件的程序工作良好。但是当提交要求更改为beads.in和beads.out时,程序崩溃。什么;问题出在哪里? 这是我的密码: #include <stdio.h> #include<string.h> main () { FILE *fin = fopen ("beads.in", "r"); FILE *fout = fopen ("beads.out", "w"); int n;

我从usaco那里试着解决这个问题。当我使用txt文件,而使用文件的程序工作良好。但是当提交要求更改为beads.in和beads.out时,程序崩溃。什么;问题出在哪里? 这是我的密码:

#include <stdio.h>
#include<string.h>
main () {
    FILE *fin  = fopen ("beads.in", "r");
    FILE *fout = fopen ("beads.out", "w");
    int n;
    char str[400];
    char now,rev_now;
    int pos,forward,reverse,sum,max=0,i,j,k;
    fscanf(fin,"%d\n%s",&n,str);
    n--;
    for(pos=0;pos<=n;pos++){
        now=str[pos];
        if(pos==0)k=n;
        else k=pos-1;
        rev_now=str[k];
        forward=2;
        int flag1=0,flag2=0,reverse=2;

        for(i=pos,j=k;;){
            if(i==n)i=-1;
            if((str[i+1]==now||str[i+1]=='w')&&flag1==0){
                i++;
                forward++;
            }
            else{
                flag1=1;
            }
            if(j==0)j=n+1;
            if((str[j-1]==rev_now||str[j-1]=='w')&&flag2==0){
                j++;
                reverse++;
            }
            else{
                flag2=1;
            }
            if(flag1==1 && flag2==1)break;
        }
        sum=forward+reverse;
        if(max<sum){max=sum;}
    }
    fprintf(fout,"%d\n",max);
    return 0;
}
#包括
#包括
主要(){
文件*fin=fopen(“beads.in”,“r”);
文件*fout=fopen(“beads.out”,“w”);
int n;
char-str[400];
现在是char,现在是rev_;
整数位,正向,反向,和,最大值=0,i,j,k;
fscanf(fin、%d\n%s、&n、str);
n--;

对于(pos=0;pos您确定已创建
beads.in
beads.out

根据手册页

 r      Open  text  file  for  reading.  The stream is positioned at the
        beginning of the file.

 w      Truncate  file  to  zero length or create text file for writing.
        The stream is positioned at the beginning of the file.

可能是
beads。in
不是在fopen之前创建的。最好检查
fopen
的状态,使用
peror
你提到它与文本文件一起工作。我猜
beads.in
不是文本文件,而是二进制文件。如果是这样,那么@KVD建议使用:
fopen(“beads.in”、“rb”);
fopen(“beads.out”、“wb”)
应该可以工作。程序会因二进制输入数据而崩溃的原因是,您要求
fscanf
将数据复制到
str
缓冲区中,直到它遇到换行符。很可能,
beads.in
文件超过400个字符,这将导致缓冲区溢出并开始覆盖程序堆栈。

使用gdb或其他调试器查看崩溃的确切位置和原因。也许您可以尝试
fopen(“beads.in”,“rb”);
fopen(“beads.out”,“wb”);
。您能给出beads.in内容示例吗?