gpt4 book ai didi

C 结构值乱码

转载 作者:太空宇宙 更新时间:2023-11-04 08:27:01 25 4
gpt4 key购买 nike

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

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

用于校验和的机制是:

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 除外,这对于几乎所有应用来说都比它的值(value)更困惑),例如:

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 实际上返回类型ssize_t。我将 main 的返回类型更改为 int,因为这是标准要求的。请阅读 perror 的手册页/文档以了解它的作用以及它如何打印实际的错误消息。 EXIT_FAILUREEXIT_SUCCESS 是两个标准定义的返回值或退出代码的常量,通常分别为 1 和 0。在更大的程序中,您可能会编写辅助函数或宏来处理错误,并将整个主函数拆分为多个函数,以使代码看起来不那么困惑。


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

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

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


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

关于C 结构值乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com