2016-06-28 13 views
-4

Ich füge eine einfache Druckzeile in einen Code ein und es beeinflusst, ob die Zeile davor ausgeführt wird oder nicht. Ich habe das Terminal neu gestartet, aber es ist immer noch dasselbe. Ich habe es auf einem Online-Compiler und Executor versucht und es gibt kein Problem, aber in meinem Computer habe ich dieses Problem. Neustart des PCs hilft nicht.Das Hinzufügen einer zusätzlichen Druckzeile beeinflusst den C-Code

else 
    { 
     lf++; 
    } 

wenn ich dies lf setzen nicht erhöht und das Programm gibt "0 strings" auf meinem PC "4 strings" auf http://www.tutorialspoint.com/compile_c_online.php

Als ich es mit

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

ersetzen gibt in beiden Plattformen "4 Strings" aus (wie es sollte). Was kann der Grund dafür sein? Soweit ich weiß, sollte ein einfacher printf nicht beeinflussen, ob die Zeile davor ausgeführt wird oder nicht, unabhängig davon, welchen C-Compiler ich verwende. Hier

ist der ursprüngliche Code:

#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; 
} 

Ich benutze keine alles, was ich in mylib.h definiert in diesem Stück Code außer

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

und hier ist die Eingabedatei:

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

Willkommen bei Stack Overflow! Sie kümmern sich um die Erstellung eines [___MCVE___] (http://stackoverflow.com/help/mcve)? –

+2

Kompilieren Sie mit ** ALL WARNINGS ** aktiviert und beachten Sie die Warnungen ('gcc -Wall -Wextra ...' oder 'clang -Weverything ...'). – pmg

+1

Klingt nach UB. Kann nicht sicher sein. Fügen Sie mehr Code ein. –

Antwort

1

Sie initialisieren Ihre Variablen nicht, bevor Sie sie verwenden, damit Sie undefiniertes Verhalten aufrufen.

Sie müssen j, k usw. auf Null setzen.

+0

Es gibt auch einen Mangel an Fehlerüberprüfung, und keine Überprüfungen für das Überschreiten der Grenzen von Arrays usw. –

+0

Vielen Dank, ich habe gerade j in der Funktion sauber initialisiert und es funktioniert jetzt. – Han