c - 实现循环冗余校验的程序错误

标签 c

我尝试在c中实现crc。我的逻辑不是很好。我尝试的是将消息(msg)复制到临时变量中,最后我附加了比数字少1的零数crc 的除数 div 中的位数。

例如:

msg=11010011101100
div=1011

然后 temp 变为:

temp=11010011101100000
div= 10110000000000000

查找 temp 和 div 的异或并将其存储在 temp

给出temp=01100011101100000计算temp的第一个“1”之前出现的零的数量,并将div的字符右移到该数字,然后重复相同的过程,直到temp的十进制值变小比 div 的十进制值。这给出了余数。

我的问题是,当我在 temp 末尾附加零时,它会存储 0 以及一些特殊字符,如下所示:

temp=11010011101100000$#UFI#->Jp#|

当我调试时出现错误

浮点:堆栈下溢

这是我的代码:

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>

void main() {
    char msg[100],div[100],temp[100];
    int i,j=0,k=0,l=0,msglen,divlen,newdivlen,ct=0,divdec=0,tempdec=0;

    printf("Enter the message\n");
    gets(msg);
    printf("\nEnter the divisor\n");
    gets(div);

    msglen=strlen(msg);
    divlen=strlen(div);
    newdivlen=msglen+divlen-1;

    strcpy(temp,msg);

    for(i=msglen;i<newdivlen;i++)
        temp[i]='0';
    printf("\nModified Temp:");
    printf("%s",temp);

    for(i=divlen;i<newdivlen;i++)
        div[i]='0';
    printf("\nModified div:");
    printf("%s",div);

    for(i=newdivlen;i>0;i--)
        divdec=divdec+div[i]*pow(2,j++);

    for(i=newdivlen;i>0;i--)
        tempdec=tempdec+temp[i]*pow(2,k++);

    while(tempdec>divdec)
    {
        for(i=0;i<newdivlen;i++)
        {
            temp[i]=(temp[i]==div[i])?'0':'1';
            while(temp[i]!='1')
                ct++;
        }

        for(i=newdivlen+ct;i>ct;i--)
            div[i]=div[i-ct];

        for(i=0;i<ct;i++)
            div[i]='0';

        tempdec=0;

        for(i=newdivlen;i>0;i--)
            tempdec=tempdec+temp[i]*pow(2,l++);
    }
    printf("%s",temp);
    getch();
}

这部分代码:

for(i=newdivlen;i>0;i--)
    divdec=divdec+div[i]*pow(2,i);

给出错误浮点:堆栈下溢

最佳答案

问题是您在 NUL 终止符上写入了 0,并且没有在字符串上放置另一个 NUL 终止符。所以 printf 会变得困惑并打印垃圾。也就是说这段代码

for(i=msglen;i<newdivlen;i++)
    temp[i]='0';
printf("\nModified Temp:");
printf("%s",temp);

应该是

for(i=msglen;i<newdivlen;i++)
    temp[i]='0';
temp[i] = '\0';               // <--- NUL terminate the string
printf("\nModified Temp:");
printf("%s",temp);

关于c - 实现循环冗余校验的程序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29057467/

相关文章:

c - 什么情况下我们使用堆排序?

c - 如何为USB端口编写一个简单的C程序?

c - 在 C 中访问结构元素

C初学者: Need explanation of error messages from "ideone"

c - 是否有理由不键入强制转换指针 (C)?

c - 通过 libpcap 写一个类似 squid 的程序

c - start.exe : 0xC0000005: Access violation writing location 0x00000000 中 0x61e1f5cf (msvcr90d.dll) 的未处理异常

c - for(i=0; i<5; x=(i++,a++)) 如何工作

c - 如何在读取文件时倒回到行首。 C

c - 在 C 中实现滚动文本