我有以下字符串:
char str[] = "A/USING=B)";
我想要分割文本,使用
/USING=
作为分隔符来获取独立的A
和B
值。请问如何实现?我知道strtok()
函数,但它只能按照单个字符进行分割。#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 = '\0'; // 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;
}
strtok()
,但它只能按照单个字符作为分隔符进行拆分。strtok()
的man page(我的强调):delim
参数指定了一个字节集,用于分隔解析字符串中的标记。[...] 在解析字符串中,两个或多个连续的分隔符字节序列被视为单个分隔符。 [...]"/USING="
作为分隔符来完成任务。strtok()
和所示输入的问题。如果输入不同,还有其他方法可以利用,比如strstr()
。 - Sourav Ghoshstrtok
不会根据子字符串进行分割,而是根据一组分隔符进行分割。对于在字符串中找到的每个分隔符,它都会进行分割。因此,strtok
无法像你提到的那样使用子字符串进行分割。 - undefinedchar *strtokstr_r(char *s, char *delim, char **save_ptr)
{
char *end;
if (s == NULL)
s = *save_ptr;
if (s == NULL || *s == '\0')
{
*save_ptr = s;
return NULL;
}
// Skip leading delimiters.
while (strstr(s,delim)==s) s+=strlen(delim);
if (*s == '\0')
{
*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;
}
char *split(char *str, const char *delim)
{
char *p = strstr(str, delim);
if (p == NULL) return NULL; // delimiter not found
*p = '\0'; // 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。这是我在谷歌上搜索您的问题时得到的结果。
对于您的情况,应该是:
#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
如果你想检查,可以在这里在线编译和运行。
char str[] = SELECT * FROM ACN WHERE CID=:C1 AND ACCTNAME=:C2/USING=(C1=70,C2='0D100S')
实现了代码,但它没有像我预期的那样工作,请帮我检查一下。 - Ryo
strchr
查找'/'
,'='
和')'
字符,并使用例如strncpy
(如果可以修改源字符串,则可以使用普通的strcpy
)获取子字符串。 - Some programmer dude/USING=
这个唯一的值,A
和B
只是举例,它们可能包含\
或=
。 - Ryostrstr
来查找子字符串的起始位置如何? - Some programmer dudestrtok
但仍然成功地分割了它。我甚至提到了先前提出这个问题的地方。去看看吧。 - Box Box Box Box