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

标签 c execution

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

else
    {
        lf++;
    }

当我把这个 lf 不增加并且程序在我的 PC 上输出“0 个字符串”时,在 http://www.tutorialspoint.com/compile_c_online.php 上输出“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

最佳答案

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

您需要将jk等设置为零。

关于c - 添加额外的 printf 行会影响 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38074127/

相关文章:

c++ - 在 Visual C++ 可执行文件中输出编译时间戳?

python - 为什么在 C 和 Python 中使用 OpenSSL API 时会得到不同的签名?

c - 如何运行混合语言程序

c - 如何指示可以使用内联 ASM 参数*指向*的内存?

file - 是否可以从外部文件运行 openoffice 宏?

java - Maven MOJO : Get execution configuration in runtime

java - 以给定的执行时间启动线程

c - 如何删除和更新 yajl C 库中的对象?

c - 将数组传递给 C 中的指针数组

python - 区分脚本何时运行 'directly' 或 Python 可执行文件