- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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));
这会使用结构写入所有包含。
虽然在接收方在检索特定值时遇到问题当我在接收方检索值时,我在 count
和 ans
变量中得到乱码。
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_FAILURE
和 EXIT_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/
我是一名优秀的程序员,十分优秀!