2016-06-28 2 views
-4

코드에 간단한 printf 줄을 추가하고 이전 줄이 실행되는지 여부에 영향을줍니다. 터미널을 다시 시작했지만 여전히 동일합니다. 나는 온라인 컴파일러와 집행자에게 그것을 시험해 보았지만 아무런 문제가 없다. 그러나 내 컴퓨터에는이 문제가있다. PC를 다시 시작해도 도움이되지 않습니다.추가 printf 줄을 추가하면 C 코드에 영향을받습니다.

else 
    { 
     lf++; 
    } 

내가

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

로 교체 할 때이 LF가 http://www.tutorialspoint.com/compile_c_online.php

에, "4 문자열을"증가 내 PC에 프로그램 출력 "0 문자열"되지 넣어 그것을 두 플랫폼 모두에서 "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; 
} 

내가

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

를 제외하고이 코드 조각에 mylib.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

스택 오버 플로우에 오신 것을 환영합니다! [___MCVE___] (http://stackoverflow.com/help/mcve)를 만드시겠습니까? –

+2

** ALL WARNINGS **를 사용하여 컴파일하고 경고를 유의하십시오 ('gcc -Wall -Wextra ...'또는'clang -Weverything ...'). – pmg

+1

UB처럼 들립니다. 확실하지 않습니다. 더 많은 코드를 붙여 넣으십시오. –

답변

1

정의되지 않은 동작을 사용하기 전에 변수를 사용하기 전에 변수를 초기화하지 마십시오.

j, k 등을 0으로 설정해야합니다.

+0

또한 오류 검사가 부족하고 배열의 경계를 넘어서는 검사가 없습니다. –

+0

감사합니다. 방금 함수를 깨끗하게 초기화 했으므로 이제 작동합니다. – Han