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
Willkommen bei Stack Overflow! Sie kümmern sich um die Erstellung eines [___MCVE___] (http://stackoverflow.com/help/mcve)? –
Kompilieren Sie mit ** ALL WARNINGS ** aktiviert und beachten Sie die Warnungen ('gcc -Wall -Wextra ...' oder 'clang -Weverything ...'). – pmg
Klingt nach UB. Kann nicht sicher sein. Fügen Sie mehr Code ein. –