添加额外的 printf 行会影响 C 代码 [关闭]

Posted

技术标签:

【中文标题】添加额外的 printf 行会影响 C 代码 [关闭]【英文标题】:Adding an additional printf line affects C code [closed] 【发布时间】:2016-06-28 10:48:32 【问题描述】:

我在代码中添加了一个简单的 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

【问题讨论】:

欢迎来到 Stack Overflow!你介意创建一个MCVE吗? 在启用 ALL WARNINGS 的情况下编译并注意警告(gcc -Wall -Wextra ...clang -Weverything ...)。 听起来像 UB。不能确定。粘贴更多代码。 我用 -Wall -Wextra 编译过,没有警告。 @pmg 这是一些严重的意大利面条代码。一旦你得到这个工作,我强烈建议将工作代码发布到codereview.stackexchange.com。 【参考方案1】:

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

您需要将jk 等设置为零。

【讨论】:

还严重缺乏错误检查,也没有检查超出数组的范围等。 谢谢,我刚刚在函数 clean 中初始化了 j ,它现在可以工作了。

以上是关于添加额外的 printf 行会影响 C 代码 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在不影响发布者类型的情况下向发布者转换链添加额外的逻辑

C: printf参数执行顺序与前置后置自增自减的影响

visual studio c/c++报错:向“printf”传递了额外参数: _Param_ 未由格式字符串使用

异常代码对 C++ 性能的影响? [关闭]

如何影响目标的顺序,为 Makefile.am 添加额外的步骤等?

unity中协程一直运行会有啥影响