我有一个字符串:"foo$bar@baz"
我想编写一个C程序,将其中的三个子字符串("foo"
, "bar"
和"baz"
)提取出来,并将每个子串放入自己的字符串中。
P.S. 不用担心,这不是作业。
strtok("foo$bar@baz","$");
。 - Steve Jessop由于这是纯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);
}
如果不是为了作业,建议不要使用 strtok 函数。如果你不能使用 C++(为什么呢?),那么应该使用 strtok_r 函数(可重入版本)。
Strtok在分词时会保留一个静态缓冲区,如果在其他地方调用它并传入一个新的非NULL字符串,就会覆盖该缓冲区,从而破坏您所需的功能。例如,使用不同字符串交织的调用。
相反,您可以使用strsep,它类似于strtok,但您需要自己保留临时缓冲区,以便在需要对多个字符串进行分词时使用,例如使用不同字符串交织的调用。
在小型项目中,这个问题可能不会出现,但在大型项目中可能会出现。
编辑:这不是标准C,因此在尝试使用之前,请确保您有此函数。我确定它在BSD上可用,可能也适用于其他Unix系统。
编辑:strsep和strtok_r似乎具有相同的功能。