2016-06-28 89 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

相關問題