gpt4 book ai didi

c - snprintf 不将最后一个字符存储在缓冲区中?

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

我写了一个简单的小程序来使用 snprintf 读取具有以下格式的文件,

skip first 15 chars , next 9 chars are sequence number, next 2 char is message and so on.   

我对序列号和消息感兴趣,即从 char no 16 到 26;

下面是程序。它不会读取每个字段的最后一个字符。它为序列号读取 8 个字符而不是 9 个字符,为消息读取 1 个字节而不是 2 个字节。

#include<stdio.h>

typedef struct
{
char seqno[9];
char msg[2];
}Header_T;

int main()
{
char buf[64]={'\0'};
FILE *fp;
int i = 0;
Header_T hdr1;
int skipbytes = 15;

fp=fopen("asdf", "r");
if (fp == NULL)
{
printf("FILE OPEN ERROR\n");
}
printf("--sequence--msg--\n");
while( fgets( buf, sizeof(buf), fp ) != NULL )
{
i=skipbytes;
snprintf(hdr1.seqno, 9, "%s", (buf+i));
i+=sizeof(hdr1.seqno);
snprintf(hdr1.msg, 2, "%s", (buf+i));
i=0;

printf("--%s--%s--\n", hdr1.seqno, hdr1.msg);
memset(buf, '\0', 64 );
}
fclose(fp);
return 0 ;
}

部分文件内容如下

201301082323458000000001H QB234
201301082323558000000002J QB234
201301082323658000000003N QB234
201301082323758000000004JRQB234
201301082333458000000010JSQB234

所以预期的输出是

--sequence--msg--
--000000001--H --
--000000002--J --
--000000003--N --
--000000004--JR--
--000000010--JS--

但是我得到的输出是

--seqno--msgtype--
--00000000--H--
--00000000--J--
--00000000--N--
--00000000--J--
--00000001--J--

谁能解释这种行为以及如何解决它?

我尝试使用 for loop character-by-character assignment 代替 snprintf 并且程序工作正常;但为此我需要为结构中的字节对齐添加一些填充符。

我也尝试过使用 pragma pack() 但它也没有任何区别。

我在 ubuntu 64 位机器上使用 gcc 4.4.3

最佳答案

来自 cppreference

int snprintf ( char * s, size_t n, const char * format, ... );

n: Maximum number of bytes to be used in the buffer.

The generated string has a length of at most n-1, leaving space for the additional terminating null character.

因此,如果您希望有 9 个字符,则应将 n 作为 10 而不是 9 传递:

snprintf(hdr1.seqno, 10, "%s", (buf+i));

Header_T 需要相应地更改:

typedef struct
{
char seqno[10];
char msg[3];
}Header_T;

关于c - snprintf 不将最后一个字符存储在缓冲区中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18040489/

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