在C中提取子串

时间:2009-12-07 18:14:17

标签: c string

我有字符串:"foo$bar@baz"

我正在编写一个C程序,它将额外添加所有三个子字符串("foo""bar""baz")并将每个子字符串放入其自己的字符串中。

P.S。别担心,这是作业。

4 个答案:

答案 0 :(得分:10)

您要找的是strtok。它允许您设置分隔符。

答案 1 :(得分:1)

如果不是作业:-)而不是strtok,如果你不能使用C ++(为什么?)你应该使用strtok_r(reentrent版本)

答案 2 :(得分:1)

由于这是直接的C,重新访问字符串的存储和终止方式可能会很有趣。由于每个部分都有一个终止字符,因此您可以将其设置为真正的终结符('\ 0')并保留字符串:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {

char *s1,*s2,*s3, *test = "foo$bar@baz";
char *buf=(char *)malloc(100);
char *p,c;

strcpy(buf, test);

s1 = p = buf;
while(c = *p) {
  if (c == '$') { *p = '\0'; s2 = p+1; }
  if (c == '@') { *p = '\0'; s3 = p+1; }
  p++;
}

printf("s1 = %s\n",s1);
printf("s2 = %s\n",s2);
printf("s3 = %s\n",s3);

}

我不会在生产代码中这样做,在这个时代。但回过头来,在循环上做一次传递,再存储一份副本,就算是一场大胜利。

答案 3 :(得分:0)

Strtok在标记时会保留一个静态缓冲区,如果在其他位置使用新的非NULL字符串调用则会被覆盖,这可能会破坏您正在寻找的功能。例如用不同的字符串交织在一起。

相反,您可以使用strsep,就像strtok一样,但是您自己保留临时缓冲区,以防您需要对多个字符串进行标记,例如:与不同字符串的交织呼叫。

在小的情况下,这个问题可能不会出现,但它可以在更大的项目中出现。

编辑:这不是标准,所以在尝试使用之前请确保您具有此功能。我肯定知道它可以在BSD上使用,也可能在其他unix的

中使用

编辑:strsep和strtok_r似乎具有相同的功能