- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个简单的小程序来使用 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/
在我从事的项目(一个 Windows 和 Ubuntu 应用程序)中,我定义了一个与日志库交互的宏。本质上,这个宏接受类似 printf 的输入,转换为字符串,并将其发送到日志库。我附上一个使用 st
我正在尝试使用 snprintf基于我读过的手册的函数是 的一部分header 但是我收到一个错误,它已被隐式声明。这是我的代码: #include #include #include str
当我通过 Fortify 分析器工具之一运行我的代码时,它提示 snprintf 说“格式字符串参数没有正确限制函数可以写入的数据量” 我了解 snprintf 不应导致缓冲区溢出。但仍然是为什么该工
在我的代码中,我使用 snprintf 如下所示,并且能够看到以下行为 char text[30] = {0}; snprintf(text, sizeof(text), "%s", "hello")
我创建了以下程序: #include #include #define TESTER "name=%s " int main(){ char *x; x = malloc(100);
当我通过 Fortify 分析器工具之一运行我的代码时,它提示 snprintf 说“格式字符串参数没有正确限制函数可以写入的数据量” 我了解 snprintf 不应导致缓冲区溢出。但仍然是为什么该工
我收到 format not a string literal and no format arguments当我在 Linux 上编译它时发出警告。 snprintf显示 const char*对于
char symbols[16] = ""; int index = 0; while (1) { if (index % 2) snprintf(symbols, siz
我正在尝试了解 snprintf 并找到了 this answer举个例子: char buf[20] = ""; char *cur = buf, * const end = buf + sizeo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试理解 C 中的 char 指针。基本上我正在做的是声明一个 char* 指针 main 并在另一个函数中通过引用传递并在那里进行修改。现在,我想打印 main 中 char 的值,这给了我段
我正在使用 C 语言(指针、指针-指针等,我喜欢它)做我的第一步,所以如果这是一个愚蠢的问题,请仁慈。 该片段不输出任何内容: char buf[256]; snprintf(buf, sizeof
我需要将一些数字(整数和 double )转换为 std::strings,并且出于性能原因不能使用 stringstream(我们发现它在同时使用时非常慢) 如果能做这样的事情就好了 templat
我已经查看这段代码一段时间了,但似乎找不到我的错误。我想我知道 snprintf(dest, n, fmt, src) 应该如何工作(它在填充 后返回 src 缓冲区中剩余的字符数>dest 缓冲区与
为什么 snprintf 在第二种情况下给出不同的值。是不是因为任何整数限制。您能否解释一下 snprintf 的工作原理以及为什么会出现负值 #include #include main() {
考虑以下代码: char *myContent = "content"; int size = snprintf(NULL, 0, "INSERT INTO myTable (col1) VALUES
我正在编写自己的 ncurses 库,突然发现在 GDB 中 snprintf() 返回的长度大于我指定的长度。这是定义的行为还是我的一些错误? (可重现的)片段代码是这样的: niko: snipp
我写了一个简单的小程序来使用 snprintf 读取具有以下格式的文件, skip first 15 chars , next 9 chars are sequence number, next 2
我使用snprintf 将格式化的数据写入磁盘,但我有一个问题,如何将它保存到用户的主目录? snprintf(filename, sizeof(filename), "%s_%s.sho", cl
定义: CHAR_BACKSLASH 定义为 '\\' 或 0x5C 变量: workingDir 是一个 C 字符串 myFilePath 是一个 C 字符串 int len = strlen(wo
我是一名优秀的程序员,十分优秀!