添加额外的printf行会影响C代码

时间:2016-06-28 10:48:33

标签: c execution

我在代码中添加了一个简单的printf行,它会影响之前的行是否会被执行。我重新启动了终端,但它仍然是一样的。我在一个在线编译器和执行器上尝试过它并没有问题,但在我的电脑中我遇到了这个问题。重启电脑无济于事。

else
    {
        lf++;
    }

当我把这个lf没有增加并且程序输出" 0字符串"在我的电脑上," 4弦"在http://www.tutorialspoint.com/compile_c_online.php

当我用

替换它时
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

1 个答案:

答案 0 :(得分:1)

在使用变量之前不要初始化变量,因此调用未定义的行为。

您需要将 //inside toggle button toggleButton = (ToggleButton)findViewById(R.id.sound); final MediaPlayer mp = MediaPlayer.create(this, R.raw.theme); if(toggleButton.isChecked()) mp.start(); toggleButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!toggleButton.isChecked()){ mp.pause(); } else { mp.start(); mp.isLooping(); } } }); j等设置为零。