2016-06-28 85 views
-4

我正在代码中添加一条简单的printf行,它会影响前一行是否会被执行。我重新启动了终端,但它仍然是一样的。我在一个在线编译器和执行器上试了一下,没有问题,但在我的电脑中出现了这个问题。重新启动电脑没有帮助。添加额外的printf行会影响C代码

else 
    { 
     lf++; 
    } 

,当我把这个LF是不是http://www.tutorialspoint.com/compile_c_online.php

增加,我的电脑上的程序输出“0串”,“4串”当我与

else 
    { 
     lf++; 
     printf("\ndo we even get here?\n"); 
    } 

更换它在两个平台上输出“4个字符串”(它应该)。 这背后的原因是什么?据我所知,一个简单的printf不应该影响到之前的行是否被执行,与我使用的C编译器无关。

这里是原代码:

#include"mylib.h" 
#define MAX 67108863 
char tab[100][27]; 
double val[100]; 
int l; 

void showtab(FILE *fout) 
{ 
    int i, j; 
    printf("\nnumber of strings is %d\n",l); 
    for(i=0;i<l;i++) 
    { 
     fprintf(fout,"%lf ",val[i]); 
     for(j=0;j<26;j++) 
     { 
      if(tab[i][j]) 
       fputc('a'+j,fout);   
     } 
     fprintf(fout,"\n"); 
    } 
} 

int find(char*s, int stl) 
{ 
    int i, j, b=1; 
    for(i=0;i<l;i++) 
    { 
     if(tab[i][26]!=stl) 
      continue; 
     for(j=0;j<stl;j++) 
     { 
      if(tab[i][s[j]-'a']!=1) 
      { 
       b=0; 
       break; 
      } 
     } 
     if(b==0) 
     { 
      b=1; 
      continue; 
     } 
     return i; 
    } 
    return -1; 
} 

void clean() 
{ 
    int i, j, k, lf=0; 
    for(i=0;i<l-1 && j<l;i++) 
    { 
     if(j<=i) 
      j=i+1; 
     if(val[i]==0) 
     { 
      while(j<l) 
      { 
       if(val[j]!=0) 
       { 
        for(k=0;k<27;k++) 
         tab[i][k]=tab[j][k]; 
        val[i]=val[j]; 
        val[j]=0; 
        j++; 
        lf++; 
        break; 
       } 
       j++; 
      } 
     } 
     else 
     { 
      lf++; 
     } 
    } 
    l=lf; 
    return; 
} 

int main() 
{ 
    char s[26], b=1, inequ; 
    int adr, stl, i; 
    double v; 
    FILE* fin=fopen("data","r"); 
    FILE* fout=fopen("canonical.form","w"); 
    l=0; 
    while(b) 
    { 
     fscanf(fin,"%s",s); 
     if(s[0]!='<' && s[0]!='>') 
     { 
      fscanf(fin,"%lf",&v); 
      stl=strlen(s); 
      adr=find(s,stl); 
      if(adr==-1) 
      { 
       for(i=0;i<26;i++) 
        tab[l][i]=0; 
       for(i=0;i<stl;i++) 
        tab[l][s[i]-'a']=1; 
       tab[l][26]=stl; 
       val[l]=v; 
       l++; 
      } 
      else 
       val[adr]+=v; 
     } 
     else 
     { 
      if(s[0]=='<') 
       inequ=-1; 
      else 
       inequ=1; 
      b=0; 
     } 
    } 
    while(fscanf(fin,"%s %lf",s,&v)==2) 
    { 
     stl=strlen(s); 
     adr=find(s,stl); 
     if(adr==-1) 
     { 
      for(i=0;i<26;i++) 
       tab[l][i]=0; 
      for(i=0;i<stl;i++) 
       tab[l][s[i]-'a']=1; 
      val[l]=-v; 
      l++; 
     } 
     else 
      val[adr]-=v; 
    } 
    clean(); 
    if(inequ==-1) 
     fprintf(fout,"0>=\n"); 
    else 
     fprintf(fout,"0<=\n"); 
    showtab(fout); 
    return 0; 
} 

我不使用任何东西我在mylib.h定义的这段代码除了

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

,这里是输入文件:

az 1.000000 
z -1.000000 
bz 1.000000 
z -1.000000 
abz -1.000000 
z 1.000000 
ab 1.000000 
z 1.000000 
abz -1.000000 
a -1.000000 
b -1.000000 
ab 1.000000 
<= 
ab 1.000000 
b -1.000000 
zb 1.000000 
b -1.000000 
azb -1.000000 
b 1.000000 
ba 1.000000 
a -1.000000 
za 1.000000 
a -1.000000 
bza -1.000000 
a 1.000000 
xyab 3.000000 
ab -3.000000 
zab 3.000000 
ab -3.000000 
xyzab -3.000000 
ab 3.000000 
+3

欢迎来到Stack Overflow!您介意创建[___MCVE___](http://stackoverflow.com/help/mcve)? –

+2

编译**所有警告**启用并介意警告('gcc -Wall -Wextra ...'或'clang -Weverything ...')。 – pmg

+1

听起来像UB。不能确定。粘贴更多代码。 –

回答

1

在使用它们之前,您不要初始化变量,以便调用未定义的行为。

您需要将j,k等设置为零。

+0

还有一个严重缺乏错误检查,并没有超出数组边界的检查等。 –

+0

谢谢,我刚刚在函数clean中初始化了j,它现在可以工作。 – Han

相关问题