将字符串的一部分复制到C中的缓冲区中
Posted
技术标签:
【中文标题】将字符串的一部分复制到C中的缓冲区中【英文标题】:Copy a section of a string into buffer in C 【发布时间】:2021-12-31 06:55:03 【问题描述】:我有一个char buffer[ 32 ];
还有一个sourceString
,我不确定它是怎么定义的,但我认为这并不重要。
sourceString
是"abcdefgh"
要将"cdef"
复制到我使用snprintf
的缓冲区中:
snprintf( buffer, 4 + 1, "%s", sourceString + 2 );
其中 4 是复制节的大小,2 是节中第一个字符的索引
它有效,但我担心一些会导致问题的事情:
-
缓冲区大小大于字符串。在那里放松一下会不会很痛苦?
sourceString + 2
不修改 sourceString
还是这样?我不明白这到底是如何工作的。
此解决方案是否存在内存泄漏风险?
【问题讨论】:
【参考方案1】:-
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
。
【讨论】:
我更喜欢枚举而不是宏作为常量以上是关于将字符串的一部分复制到C中的缓冲区中的主要内容,如果未能解决你的问题,请参考以下文章
字符串的一部分可以复制到C中的另一个字符串吗?但复制的开始索引不为零[关闭]
JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine