将字符串的一部分复制到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

c语言中的strcpy啥意思,简单点解释

字符串的一部分可以复制到C中的另一个字符串吗?但复制的开始索引不为零[关闭]

简述C语言标准库函数strcpy功能和格式?

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

C语言,将一个字符串中的元音字母复制到另一个字符串,然后按照ASCII码从小到大的顺序输出。