虽然我能够纠正我的程序并使其正常运行,但它之所以不起作用,让我感到非常好奇。
我用malloc创建了一个字符串并对其进行了初始化...然后我用它做了几个strcat ...然后我声明了一个文件指针......之后我的字符串超过了大约。其余的26个字符将是垃圾......但是如果我先前将指针声明为字符串malloc,它的工作效果很好。我只是无法理解为什么,这里有一些代码,如果有人认为更好看到更多请说:
代码:
char* holder=(char*)malloc(sizeof(char)*100);
for(i=0;i<100;i++)
*(holder+i)='\0';
strcat(holder,"set xtics (");
//will ignore until the last n lines
for(i=0;i<26-n;i++)
readline(sfd,line,29);
//will manage the last lines
char n_column[2];
char freq[3]={0};
for(i;i<26;i++)
{
readline(sfd,line,29);
sscanf(line+4,"%s",freq);
write(out,freq,strlen(freq));
write(out,"\n",1);
strcat(holder,"'");
sscanf(line,"%s",temp);
strcat(holder,temp);
strcat(holder,"'");
sprintf(n_column,"%d",counter);
strcat(holder," ");
strcat(holder,n_column);
//for the las one which won't have the ,
if(i==25)
strcat(holder,")");
else
strcat(holder,", ");
counter++;
}
//sending to gnuplot using pipe
printf("Before: %s\n",holder);
FILE *pipe = popen("gnuplot -persist","w"); //why can't it be here!!!!
printf("After: %s\n",holder);
输出:
之前:设置xtics('a'0,'b'1,'c'2,'d'3,'e'4,'f'5,'g'6,'j'7,'k '8,'l'9,'m'10,'n'11,'o'12,'p'13,'q'14,'r'15,'u'16,'v'17,'w '18,'x'19,'y'20,'z'21,'h'22,'i'23,'t'24,'s'25)
之后:设置xtics('a'0,'b'1,'c'2,'d'3,'e'4,'f'5,'g'6,'j'7,'k '8,'l'9,'m'10,'n'11,'o'
但如果我改为:
FILE * pipe = popen(“gnuplot -persist”,“w”);
char* holder=(char*)malloc(sizeof(char)*100);
for(i=0;i<100;i++)
*(holder+i)='\0';
输出很好。
那么为什么声明文件指针有这么大的区别呢?或者是除此之外的东西?
非常感谢你耐心等待。
答案 0 :(得分:4)
你有一个100字节的缓冲区和208字节的字符串。这100个字节以外的内存不属于你。
答案 1 :(得分:3)
您正在分配100个字符的缓冲区。
您正在尝试复制超过100个字符。
你不应该对你的腐败感到惊讶。
答案 2 :(得分:2)
您可能会尝试使n_column []大于2.您正在覆盖数组的末尾。
sprintf(n_column,"%d",counter);
我不确定这是否是唯一的问题。