C 结构值乱码

C struct values garbled

checksum 的发送者和接收者有问题。我在其中使用结构来定义要写入管道的变量。

struct ANSWER
{
    int arr[BUFFER];
    int counter;
    int ans;
}a;         

用于checksum的机制是:

int chck(int value[],int count)
{
    int i,sum=0,checksum;
    for ( i=0; i<count; i++)
    {
        sum+=value[i];
    }
    printf("SUM IS :%d \n",sum);
    checksum=checksum^sum;
    printf("CHECKSUM IS : %d",checksum);
    return checksum;
}

主要问题是在管道中写成

write(pipe,a,sizeof(a));

这将使用结构写入所有包含。

虽然在接收端在检索特定值时遇到问题 当我在接收方检索值时,我在 countans 变量中得到乱码值。

read(pipe,a,sizeof(a));
printf("COUNT : \n ",a.counter);

结果是乱码。

主要地区:

void main(int argc, char * argv[])
{
    int pipe,i;

    pipe = open("devil",O_WRONLY);

    if ( pipe == -1 )
    {
        printf("ERROR NO PIPE FOUND \n");
    }

    printf("ENTER NUMBER OF ELEMENT : ");
    scanf("%d",a.counter);

    for ( i=0; i<a.counter; i++)
    {
        printf("ENTER NUMBER :");
        scanf("%d",&a.arr[i]);
    }

    a.ans=chck(a.arr,a.counter);

    printf("CHECKSUM IS : %d \n",a.ans);

    write(pipe,&a,sizeof(a));

}

将评论转为答案,我建议您为所有系统和标准库调用添加错误检查(打印到 stdout/stderr 除外,这对于几乎所有应用程序来说都比它的价值更混乱),例如:

int main(int argc, char * argv[])
{
    int pipe, i;

    pipe = open("devil",O_WRONLY);
    if ( pipe == -1 )
    {
        perror("open pipe");
        return EXIT_FAILURE;
    }

    printf("ENTER NUMBER OF ELEMENT : ");
    if (scanf("%d",&a.counter) != 1) 
    {
        fprintf(stderr, "scanf count IO or parse error, or EOF\n");
        return EXIT_FAILURE;
    }

    for ( i=0; i<a.counter; i++)
    {
        printf("ENTER NUMBER :");
        if (scanf("%d",&a.arr[i]) != 1)
        {
            fprintf(stderr, "scanf number IO or parse error, or EOF\n");
            return EXIT_FAILURE;
        }
    }

    a.ans=chck(a.arr,a.counter);
    printf("CHECKSUM IS : %d \n",a.ans);
    i = write(pipe,&a,sizeof(a));
    if (i == -1)
    {
        perror("write to pipe");
        return EXIT_FAILURE;
    }
    else if (i != sizeof(a))
    {
        fprintf(stderr, "write to pipe, partial write!\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

注意:对于迂腐的代码,write 实际上 return 键入 ssize_t。我将 return 类型的 main 更改为 int,因为这是标准要求的。请阅读 perror 的手册页/文档以了解它的作用以及它如何打印实际错误消息。 EXIT_FAILUREEXIT_SUCCESS 是两个标准定义的 return 值或退出代码的常量,通常分别为 1 和 0。在更大的程序中,您可能会编写辅助函数或宏来处理错误,并将整个主函数拆分为多个函数,以使代码看起来不那么混乱。


此外,您在 chck 函数中使用了未初始化的 checksum 变量。您可能应该将其初始化为 0,例如:

int chck(int value[],int count)
{
    int i = 0, sum = 0, checksum = 0;
    ....

一般来说,你应该避免使用未初始化的变量,第一次使用它们时很容易忘记,就像这里演示的那样...另外,打开编译器警告,所以你通常会 如果您仍然不小心这样做,请收到警告。


还有一个错误:您的第一个 scanf 缺少 & 以获取指向 a.counter 的指针(scanf 需要,以实际修改原始变量)。一个好的编译器也可能足够聪明,可以警告将可疑参数传递给 scanf.