按子字符串拆分字符串
Split string by a substring
我有以下字符串:
char str[] = "A/USING=B)";
我想拆分以获得单独的 A
和 B
值,并以 /USING=
作为分隔符
我该怎么做?我知道 strtok()
但它只是用一个字符作为分隔符。
正如其他人指出的那样,您可以使用 <string.h>
中的 strstr
来查找字符串中的分隔符。然后复制子字符串或修改输入字符串以将其拆分。
这是 returns 拆分字符串的第二部分的实现。如果字符串无法拆分,则returns NULL
,原字符串不变。如果需要将字符串拆分成更多的子串,可以重复调用尾部的函数。第一部分将是输入字符串,可能会缩短。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *split(char *str, const char *delim)
{
char *p = strstr(str, delim);
if (p == NULL) return NULL; // delimiter not found
*p = '[=10=]'; // terminate string after head
return p + strlen(delim); // return tail substring
}
int main(void)
{
char str[] = "A/USING=B";
char *tail;
tail = split(str, "/USING=");
if (tail) {
printf("head: '%s'\n", str);
printf("tail: '%s'\n", tail);
}
return 0;
}
参见this。我在 google.
上搜索你的问题时得到了这个
在你的情况下它将是:
#include <stdio.h>
#include <string.h>
int main (int argc, char* argv [])
{
char theString [16] = "abcd/USING=efgh";
char theCopy [16];
char *token;
strcpy (theCopy, theString);
token = strtok (theCopy, "/USING=");
while (token)
{
printf ("%s\n", token);
token = strtok (NULL, "/USING=");
}
return 0;
}
这使用 /USING=
作为分隔符。
这个输出是:
abcd
efgh
如果你想检查,你可以通过here在线编译运行它。
I known strtok()
but it just split by one character as delimiter
不,不是。
根据 man page strtok()
,(强调我的)
char *strtok(char *str, const char *delim);
[...] The delim
argument specifies a set of bytes that delimit the tokens in the parsed string. [...] A sequence of two or more contiguous delimiter bytes in the parsed string is considered to be a single delimiter. [...]
因此,它不必是您提到的 “一个字符”。您可以使用一个字符串,就像您的情况 "/USING="
作为分隔符来完成工作。
这里有一个小函数可以做到这一点。它的工作方式与 strtok_r 完全相同,只是分隔符被视为分隔字符串,而不是分隔字符列表。
char *strtokstr_r(char *s, char *delim, char **save_ptr)
{
char *end;
if (s == NULL)
s = *save_ptr;
if (s == NULL || *s == '[=10=]')
{
*save_ptr = s;
return NULL;
}
// Skip leading delimiters.
while (strstr(s,delim)==s) s+=strlen(delim);
if (*s == '[=10=]')
{
*save_ptr = s;
return NULL;
}
// Find the end of the token.
end = strstr (s, delim);
if (end == NULL)
{
*save_ptr = s + strlen(s);
return s;
}
// Terminate the token and make *SAVE_PTR point past it.
memset(end, 0, strlen(delim));
*save_ptr = end + strlen(delim);
return s;
}
伙计,这个答案只有在输入是这个时才有效,如果是“abUcd/USING=efgh”你的算法就不起作用。
这个答案对我来说是唯一有效的:
char *split(char *str, const char *delim)
{
char *p = strstr(str, delim);
if (p == NULL) return NULL; // delimiter not found
*p = '[=10=]'; // terminate string after head
return p + strlen(delim); // return tail substring
}
int main(void)
{
char str[] = "A/USING=B";
char *tail;
tail = split(str, "/USING=");
if (tail) {
printf("head: '%s'\n", str);
printf("tail: '%s'\n", tail);
}
return 0;
}
我有以下字符串:
char str[] = "A/USING=B)";
我想拆分以获得单独的 A
和 B
值,并以 /USING=
作为分隔符
我该怎么做?我知道 strtok()
但它只是用一个字符作为分隔符。
正如其他人指出的那样,您可以使用 <string.h>
中的 strstr
来查找字符串中的分隔符。然后复制子字符串或修改输入字符串以将其拆分。
这是 returns 拆分字符串的第二部分的实现。如果字符串无法拆分,则returns NULL
,原字符串不变。如果需要将字符串拆分成更多的子串,可以重复调用尾部的函数。第一部分将是输入字符串,可能会缩短。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *split(char *str, const char *delim)
{
char *p = strstr(str, delim);
if (p == NULL) return NULL; // delimiter not found
*p = '[=10=]'; // terminate string after head
return p + strlen(delim); // return tail substring
}
int main(void)
{
char str[] = "A/USING=B";
char *tail;
tail = split(str, "/USING=");
if (tail) {
printf("head: '%s'\n", str);
printf("tail: '%s'\n", tail);
}
return 0;
}
参见this。我在 google.
上搜索你的问题时得到了这个在你的情况下它将是:
#include <stdio.h>
#include <string.h>
int main (int argc, char* argv [])
{
char theString [16] = "abcd/USING=efgh";
char theCopy [16];
char *token;
strcpy (theCopy, theString);
token = strtok (theCopy, "/USING=");
while (token)
{
printf ("%s\n", token);
token = strtok (NULL, "/USING=");
}
return 0;
}
这使用 /USING=
作为分隔符。
这个输出是:
abcd
efgh
如果你想检查,你可以通过here在线编译运行它。
I known
strtok()
but it just split by one character as delimiter
不,不是。
根据 man page strtok()
,(强调我的)
char *strtok(char *str, const char *delim);
[...] The
delim
argument specifies a set of bytes that delimit the tokens in the parsed string. [...] A sequence of two or more contiguous delimiter bytes in the parsed string is considered to be a single delimiter. [...]
因此,它不必是您提到的 “一个字符”。您可以使用一个字符串,就像您的情况 "/USING="
作为分隔符来完成工作。
这里有一个小函数可以做到这一点。它的工作方式与 strtok_r 完全相同,只是分隔符被视为分隔字符串,而不是分隔字符列表。
char *strtokstr_r(char *s, char *delim, char **save_ptr)
{
char *end;
if (s == NULL)
s = *save_ptr;
if (s == NULL || *s == '[=10=]')
{
*save_ptr = s;
return NULL;
}
// Skip leading delimiters.
while (strstr(s,delim)==s) s+=strlen(delim);
if (*s == '[=10=]')
{
*save_ptr = s;
return NULL;
}
// Find the end of the token.
end = strstr (s, delim);
if (end == NULL)
{
*save_ptr = s + strlen(s);
return s;
}
// Terminate the token and make *SAVE_PTR point past it.
memset(end, 0, strlen(delim));
*save_ptr = end + strlen(delim);
return s;
}
伙计,这个答案只有在输入是这个时才有效,如果是“abUcd/USING=efgh”你的算法就不起作用。
这个答案对我来说是唯一有效的:
char *split(char *str, const char *delim)
{
char *p = strstr(str, delim);
if (p == NULL) return NULL; // delimiter not found
*p = '[=10=]'; // terminate string after head
return p + strlen(delim); // return tail substring
}
int main(void)
{
char str[] = "A/USING=B";
char *tail;
tail = split(str, "/USING=");
if (tail) {
printf("head: '%s'\n", str);
printf("tail: '%s'\n", tail);
}
return 0;
}