获取 char* 的子字符串

180
例如,我有以下这个:
char *buff = "this is a test string";

我想获取"test"。我该怎么做?

5个回答

258
char subbuff[5];
memcpy( subbuff, &buff[10], 4 );
subbuff[4] = '\0';

工作完成 :)


22
这会浪费内存。你已经被警告了!:P - alexandernst
27
“如何做到呢?在堆栈上分配5个字节(当它超出范围时将被释放)几乎不会浪费内存…” - Goz
1
仍然比你所需的多,但代码离开当前堆栈后,它们将被释放。 - alexandernst
13
问题在于,如果没有复制字符串数据,你无法对其进行太多操作。如果您想要从原始字符串中获取某个部分的指针,由于该部分没有空结尾符号(而且不影响原始字符串),您需要知道它的长度。 - Goz
38
别忘了加上 #include <string.h>。 - Juan Pablo Rinaldi
显示剩余4条评论

109

假设您知道子字符串的位置和长度:

char *buff = "this is a test string";
printf("%.*s", 4, buff + 10);

你可以通过将子字符串复制到另一个内存目标来实现相同的效果,但这并不合理,因为你已经在内存中拥有它。

这是使用指针避免不必要复制的好例子。


@procrastinator:并不仅仅是用于打印。如果子字符串不需要被修改,这是一种可行的方法。这样,您只需保留一对指针,而无需分配可变长度的缓冲区。 - Blagovest Buyukliev
1
抱歉如果你误解了我的意思,我的意思是你的解决方案不需要额外的字符串,这非常适合仅需要打印时使用 :-) - user1636522
7
使用sprintf函数将上述格式化后的字符串存储。 - Parnab Sanyal
@ParnabSanyal 我该如何使用sprintf来存储子字符串?我需要将子字符串长度作为第三个参数传递吗? - Verma Aman
1
@VermaAman 不是这样的。你的第一个参数应该是结果字符串,第二个参数应该是源字符串,如果第二个参数中有像%c%i等占位符,那么从第三个参数到占位符数量为止,就是占位符的实际值(用逗号分隔)。就像 printf 一样。 - Parnab Sanyal

71

使用来自<cstring>的char* strncpy(char* dest, char* src, int n)。在你的情况下,你需要使用以下代码:

char* substr = malloc(4);
strncpy(substr, buff+10, 4);

此处提供了关于strncpy函数的完整文档。


40
如果这样做,请不要忘记添加空终止字符“\ 0”。 - evandrix
15
如果这样做,不要忘记给子字符串分配足够大的内存空间。 - FUD
char *substr(char const *s, size_t start, size_t length) { char *substr = calloc(length + 1, sizeof(char)); strncpy(substr, s + start, length); return substr; } - VDVLeon

7
你可以使用 strstr 函数。示例代码在这里
请注意,返回的结果不以空字符结尾。

12
这有点像正常的子字符串操作的反向 - 更像是 indexOf。 - Grault

6
你可以直接使用 <string.h> 中的 strstr() 函数。 $ man strstr

1
请查看下面 Grault 的评论。 - adrian
@Barmar:那么在您的定义中,子字符串是什么? - VimNing
@Rainning 子字符串是指字符串的任何连续部分。例如,“def” 是 “abcdefghi” 的子字符串。 - Barmar
@Barmar:既然strstr()返回它找到的子字符串的第一个索引,但你说它不仅仅是子字符串。 - VimNing
1
问题是如何从“this is a test string”中获取“test”。这个答案将返回“test string”,而不仅仅是“test”。 - Barmar
是的,它是一个子字符串,但它仅限于达到末尾的子字符串,如果您想要像问题中那样更短的子字符串,则无法使用它。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接