添加额外的 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】:
您不会在使用变量之前对其进行初始化,因此您会调用未定义的行为。
您需要将j
、k
等设置为零。
【讨论】:
还严重缺乏错误检查,也没有检查超出数组的范围等。 谢谢,我刚刚在函数 clean 中初始化了 j ,它现在可以工作了。以上是关于添加额外的 printf 行会影响 C 代码 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
visual studio c/c++报错:向“printf”传递了额外参数: _Param_ 未由格式字符串使用