gpt4 book ai didi

c - 使用 readv() linux 系统调用时,冗余字符被添加到缓冲区之一

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

我遇到了(可能)我无法解释的错误,如果有人能解释我会很高兴。

**我写了下面的程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/uio.h>
#include <string.h>


int main(int argc, char** argv)
{

char arr1[5], arr2[5], arr3[5];
struct iovec iov[3];
ssize_t n;
int fd, i;


fd = open("/home/oz/Desktop/test", O_RDONLY);
if (fd == -1)
{
perror("open error");
return (1);
}

iov[0].iov_base = arr1;
iov[1].iov_base = arr2;
iov[2].iov_base = arr3;
iov[0].iov_len = 5;
iov[1].iov_len = 5;
iov[2].iov_len = 5;

n = readv(fd, iov, 3);
if (n == -1)
{
perror("read error");
return (1);
}


for (i = 0; i < 3; i++)
{
printf("Buffer %d Content : [%s]\n", i, (char *)iov[i].iov_base);
}


// DEBUG - START
printf("Total bytes read : %d\n", (int)n);
char * TEST = iov[0].iov_base;
printf("TEST LAST CHARACTER (int)= %d.\nTEST LENGTH = %d\n", TEST[5], (int)strlen(TEST));
// DEBUG - END

return 0;

我读取的文件内容(单行文本文件):123456789012345678901234567890

**输出

Buffer 0  Content : [12345]
Buffer 1 Content : [67890]
Buffer 2 Content : [12345]
Total bytes read : 15
TEST LAST CHARACTER (int)= 127.
TEST LENGTH = 6

**我的问题:由于某种未知原因,ASCII 值为 127 的字符被添加到第一个缓冲区。 (在我的标准输出中,我实际上在输出的第一行中将其视为“5”和“]”之间的白色方 block 。为什么会发生这种奇怪的事情?

谢谢你..

最佳答案

没有添加额外的字符。您的程序中有两个错误。

  1. 您引用了 TEST[5](即 arr1[5]),它超出了 arr1 数组的末尾。 C ararys是从零开始的,所以唯一有效的值是:arr1[0], arr1[1], arr1[2], arr1[3],和arr1[4]arr1[5] 是数组中的第六个条目,而不是第五个
  2. 您打印一个没有 nul 结尾的字符数组。 C 字符串需要一个终止零,您没有提供。因此,运行时系统会愉快地打印超出数组末尾的任何字符。

对您的程序进行以下更改:

printf("Buffer %d  Content : [%5.5s]\n", i, (char *)iov[i].iov_base);
...
printf("TEST LAST CHARACTER (int)= %d.\nTEST LENGTH = %d\n", TEST[4], 5);

关于c - 使用 readv() linux 系统调用时,冗余字符被添加到缓冲区之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9384314/

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