我有字符串:"foo$bar@baz"
我正在编写一个C程序,它将额外添加所有三个子字符串("foo"
,"bar"
和"baz"
)并将每个子字符串放入其自己的字符串中。
P.S。别担心,这是不作业。
答案 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似乎具有相同的功能