在C语言中提取子字符串

5

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

我想编写一个C程序,将其中的三个子字符串("foo", "bar""baz")提取出来,并将每个子串放入自己的字符串中。

P.S. 不用担心,这不是作业。


你有取得任何进展吗?如果你提出更具体的问题,你可能会得到更多的答案。现在你正在要求别人在答案框中为你编写整个程序。 - benzado
4个回答

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

4
只要被分词的字符串是可修改的,就不要执行strtok("foo$bar@baz","$"); - Steve Jessop
1
为什么有9个赞和1个踩,分数却是7?我猜可能有人不喜欢strtok.. 很奇怪。 - monksy

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);

}

我现在不会在生产代码中这样做。但是很久以前,只需要一次循环和一个存储副本的方式,被认为是一个巨大的胜利。

真糟糕,如果算上strcpy,就需要2次遍历。复制和设置循环留给读者自己练习。 - john personna
那就不要先复制 :) - warren

1

如果不是为了作业,建议不要使用 strtok 函数。如果你不能使用 C++(为什么呢?),那么应该使用 strtok_r 函数(可重入版本)。


0

Strtok在分词时会保留一个静态缓冲区,如果在其他地方调用它并传入一个新的非NULL字符串,就会覆盖该缓冲区,从而破坏您所需的功能。例如,使用不同字符串交织的调用。

相反,您可以使用strsep,它类似于strtok,但您需要自己保留临时缓冲区,以便在需要对多个字符串进行分词时使用,例如使用不同字符串交织的调用。

在小型项目中,这个问题可能不会出现,但在大型项目中可能会出现。

编辑:这不是标准C,因此在尝试使用之前,请确保您有此函数。我确定它在BSD上可用,可能也适用于其他Unix系统。

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


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