将一段字符串复制到C中的缓冲区中
Copy a section of a string into buffer in C
我有一个char buffer[ 32 ];
还有一个 sourceString
,我不确定它是如何定义的,但我认为这不重要。
sourceString
是 "abcdefgh"
要将其复制 "cdef"
到缓冲区中,我使用 snprintf
:
snprintf( buffer, 4 + 1, "%s", sourceString + 2 );
其中 4 是复制部分的大小,2 是该部分中第一个字符的索引
它有效,但我担心一些事情会导致问题:
- 缓冲区大小大于字符串。那里松懈会痛吗?
sourceString + 2
不修改 sourceString
还是修改?我不明白这是怎么回事。
- 此解决方案是否存在内存泄漏的风险?
- 你在 byes (32 - (4 + 1)) = 27 中浪费了一些内存。这样做没问题,而且是一种相当常见的技术,既可以用于编译时分配,也可以用于 运行-时间分配。但是,请使用 #define 而不是神奇的 4、2 和 32 数字:
#define BUFFER_LEN 32
#define SOURCE_SUBSTR_LEN 4
#define SOURCE_OFFSET 2
char buffer[BUFFER_LEN];
...
不,它只是计算一个地址,该地址是从字符串开头算起的 2 个元素。如果愿意,您也可以将其表示为 &sourceSring[2]
。
没有。内存泄漏通常意味着堆分配内存(malloc、realloc、calloc)并且buffer[32]
是在编译时(在堆栈上)分配的。
考虑使用 strncpy
(或 memcpy
)代替 snprintf
。
我有一个char buffer[ 32 ];
还有一个 sourceString
,我不确定它是如何定义的,但我认为这不重要。
sourceString
是 "abcdefgh"
要将其复制 "cdef"
到缓冲区中,我使用 snprintf
:
snprintf( buffer, 4 + 1, "%s", sourceString + 2 );
其中 4 是复制部分的大小,2 是该部分中第一个字符的索引
它有效,但我担心一些事情会导致问题:
- 缓冲区大小大于字符串。那里松懈会痛吗?
sourceString + 2
不修改sourceString
还是修改?我不明白这是怎么回事。- 此解决方案是否存在内存泄漏的风险?
- 你在 byes (32 - (4 + 1)) = 27 中浪费了一些内存。这样做没问题,而且是一种相当常见的技术,既可以用于编译时分配,也可以用于 运行-时间分配。但是,请使用 #define 而不是神奇的 4、2 和 32 数字:
#define BUFFER_LEN 32
#define SOURCE_SUBSTR_LEN 4
#define SOURCE_OFFSET 2
char buffer[BUFFER_LEN];
...
不,它只是计算一个地址,该地址是从字符串开头算起的 2 个元素。如果愿意,您也可以将其表示为
&sourceSring[2]
。没有。内存泄漏通常意味着堆分配内存(malloc、realloc、calloc)并且
buffer[32]
是在编译时(在堆栈上)分配的。
考虑使用 strncpy
(或 memcpy
)代替 snprintf
。