文件IO和字符串C中的意外值

文件IO和字符串C中的意外值,c,string,pointers,file-io,buffer,C,String,Pointers,File Io,Buffer,我用C语言编写了这个程序来打印另一个程序的长case语句的一部分。但它正在打印意外值,我无法调试它。请帮忙 节目: #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<math.h> #include<string.h> void main() { FILE *fp; int i=0, N=32, att=0, attbuf=0; flo

我用C语言编写了这个程序来打印另一个程序的长case语句的一部分。但它正在打印意外值,我无法调试它。请帮忙

节目:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
void main()
{
    FILE *fp;
    int i=0, N=32, att=0, attbuf=0;
    float fout=6000.0;
    unsigned long ftw;
    long double fin;
    char *ddata;
    char *dbit="32'b";
    char *pdata;
    char *adata;
    char *abit="5'b";
    char *buffer1;
    char *buffer2;
    fp = fopen("test1.txt", "w");
    if (fp == NULL)
    {
        puts("Cannot open target file");
        exit(0);
    }
    for(i=0;i<=1;i++)
    {
        fin = fout / N;
        if((fin== (long double)(3500/11)) || (fin==(3500/10)) || (fin==(long double)(3500/9)) || (fin==(double)(3500/8)) || (fin==(3500/7)))
    {
            N = 36;
            fin = fout / N;
        }
    ftw = (long)((pow(2,32)*(fin/3500))+0.5);
    itoa(ftw, buffer1, 2);
    ddata = strcat(dbit, buffer1);

    if(N == 32)
    {
        pdata = "8'b10000000";
    }
    else if (N == 36)
    {
        pdata = "8'b10000010";
    }
    puts(pdata);

    if((fout >= 6000) && (fout <= 10000))
    {
        att = 0;
    }
    attbuf = ~att;
    itoa(attbuf, buffer2, 2);
    adata = strcat(abit, buffer2);

    fputs("\t\t\t\t\t", fp);
    fprintf(fp, "%d\t:\tbegin\n",i);
    fprintf(fp, "\t\t\t\t\t\t\t\to_data [31:0] <= %s;\n", ddata);
    fprintf(fp, "\t\t\t\t\t\t\t\to_pdata [7:0] <= %s;\n", pdata);
    fprintf(fp, "\t\t\t\t\t\t\t\to_adata [4:0] <= %s;\n", adata);
}
    fclose(fp);

}
我得到的结果是:

0   :   begin
o_data [31:0] <= 32'b11011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 1011011011011101111111111111111;
1   :   begin
o_data [31:0] <= 32'b1101101101101110111111111111111111011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 101101101101110111111111111111111011011011011101111111111111111;
我想要的输出如下:

0   :   begin
o_data [31:0] <= 32'b11011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 5'b11111;
1   :   begin
o_data [31:0] <= 32'b11011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 5'b11111;
为什么会发生这种情况?

代码如下:

fin == (long double)(3500/11)
并不意味着你可能期望它意味着什么。除法是整数,因为3500和11都是整数。强制转换只是将最终生成的整数转换为长双精度,它不会使除法成为浮点

为此,您需要例如fin=长双3500/11


另外,也就是说,和往常一样,比较浮点数是否与==完全相等是一个非常糟糕的主意。设置距离期望值的阈值要好得多。

我看到一堆指针,而不是单个分配或有效分配的地址。再加上对只读字符串文字的写入,您将发现对未定义行为的调用非常深入。谢谢。你能指出一些无效的行吗。为什么adata会有一个垃圾值,为什么下次会追加ddata?如果我注释从for循环的第一个语句到ddata赋值的代码,adata很好,但我需要将其截断为5位二进制,这是我无法做到的。ddata=strcatdbit,buffer1;,adata=strcatabit,buffer2;:由于1 dbit和abit是字符串文字,因此无法连接此类。2没有足够的空间存储合并结果。@BLUEPIXY感谢您解释错误的作业。你的建议奏效了!!我已经宣布fin为长双人。在该语句中,我想检查计算为fout/N的fin值是否等于3500/11。如何将结果保留为小数点后有许多有效数字的浮点值?@user3776279我的观点是鳍的类型无关紧要,就像我上面所说的。演员也不会,因为括号遗漏了它想要影响的表达。