在c中标记字符串
我需要用c来标记字符串。假设我有一根这样的线 “产品=c,作者=丹尼斯,类别=编程” 我只想提取这些键值对中的值。像在c中标记字符串,c,C,我需要用c来标记字符串。假设我有一根这样的线 “产品=c,作者=丹尼斯,类别=编程” 我只想提取这些键值对中的值。像 [c,丹尼斯,编程] 我使用了strtok函数,它用“=”标记,然后我得到值 [产品、c、作者、丹尼斯、类别、编程] 是否有任何内置函数只能生成上述值。我可以想出几种方法: 首先在,上标记,然后在=上拆分每个部分 找到第一个=,然后找到它后面的,,然后找到中间的单词。重复一遍 如果始终有三个值,则可以使用sscanf读取这些值 您可以使用正则表达式库来解析字符串 我可以想出两种
[c,丹尼斯,编程]
我使用了strtok函数,它用“=”标记,然后我得到值
[产品、c、作者、丹尼斯、类别、编程]
是否有任何内置函数只能生成上述值。我可以想出几种方法:
- 首先在
上标记,然后在,
上拆分每个部分=
- 找到第一个
,然后找到它后面的=
,然后找到中间的单词。重复一遍,
- 如果始终有三个值,则可以使用sscanf读取这些值
- 您可以使用正则表达式库来解析字符串
- 首先在
上标记,然后在,
上拆分每个部分=
- 找到第一个
,然后找到它后面的=
,然后找到中间的单词。重复一遍,
- 如果始终有三个值,则可以使用sscanf读取这些值
- 您可以使用正则表达式库来解析字符串
- 我可以想出两种方法:
- 只是一个简单的扫描
#include<stdio.h>
int main()
{
char token[20] = { 0 };
char c, name[20];
int i=0, offset;
while (scanf("%[a-z]%*[^a-z]", token) == 1) {
i++;
if(i%2==0)
printf("[%s]\n",token );
}
return 0;
}
./a.out
product=c,author=dennis,category=programming,
[c]
[dennis]
[programming]
Ctrl+D
#包括
int main()
{
字符标记[20]={0};
字符c,名称[20];
int i=0,偏移量;
而(scanf(“%[a-z]]*[^a-z]”,令牌)==1){
i++;
如果(i%2==0)
printf(“[%s]\n”,标记);
}
返回0;
}
/a.out
product=c,author=dennis,category=programming,
[丙]
[丹尼斯]
[编程]
Ctrl+D
注意。我在字符串末尾添加了,
,只是一个简单的扫描
#include<stdio.h>
int main()
{
char token[20] = { 0 };
char c, name[20];
int i=0, offset;
while (scanf("%[a-z]%*[^a-z]", token) == 1) {
i++;
if(i%2==0)
printf("[%s]\n",token );
}
return 0;
}
./a.out
product=c,author=dennis,category=programming,
[c]
[dennis]
[programming]
Ctrl+D
#包括
int main()
{
字符标记[20]={0};
字符c,名称[20];
int i=0,偏移量;
而(scanf(“%[a-z]]*[^a-z]”,令牌)==1){
i++;
如果(i%2==0)
printf(“[%s]\n”,标记);
}
返回0;
}
/a.out
product=c,author=dennis,category=programming,
[丙]
[丹尼斯]
[编程]
Ctrl+D
注意。我在字符串的末尾添加了
,
,您可以像这样跳过每一秒标记:
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "product=c,author=dennis,category=programming";
char* p = strtok(str, ",=");
while (p != NULL) {
p = strtok(NULL, ",=");
if (p != NULL) {
printf("%s\n", p);
strtok(NULL, ",="); // skip this
}
}
return 0;
}
#包括
#包括
内部主(空){
char str[]=“产品=c,作者=丹尼斯,类别=编程”;
char*p=strtok(str,“,=”);
while(p!=NULL){
p=strtok(空,“,=”);
如果(p!=NULL){
printf(“%s\n”,p);
strtok(NULL,=”;//跳过此操作
}
}
返回0;
}
您可以像这样跳过每一秒标记:
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "product=c,author=dennis,category=programming";
char* p = strtok(str, ",=");
while (p != NULL) {
p = strtok(NULL, ",=");
if (p != NULL) {
printf("%s\n", p);
strtok(NULL, ",="); // skip this
}
}
return 0;
}
#包括
#包括
内部主(空){
char str[]=“产品=c,作者=丹尼斯,类别=编程”;
char*p=strtok(str,“,=”);
while(p!=NULL){
p=strtok(空,“,=”);
如果(p!=NULL){
printf(“%s\n”,p);
strtok(NULL,=”;//跳过此操作
}
}
返回0;
}
您可以首先在,
上标记,将内容拆分为3个不同的字符串,然后在“=”上标记这些字符串中的每一个:
char *kvpair[N] = {NULL}; // where N is large enough for the expected
// number of key-value pairs
char *tok = strtok(input, ",");
size_t kvcount = 0;
while (tok != NULL && kvcount < N)
{
kvpair[kvcount++] = tok;
tok = strtok(NULL, ",");
}
...
for (i = 0; i < kvcount; i++)
{
char delim = '[';
char *key = strtok(kvpair[i], "=");
char *val = strtok(NULL, "=");
printf("%c%s", delim, val);
delim = ',';
}
putchar(']');
char*kvpair[N]={NULL};//其中,N足够大,以满足预期的
//键值对的数目
char*tok=strtok(输入“,”);
大小\u t kvcount=0;
while(tok!=NULL&&kvcount
这只是一个粗略的草图;它假定提前知道最大的键值对数,它不会尝试处理空键或值,也不会真正进行任何类型的错误处理。但它应该为你指明正确的方向
记住,strok
修改其输入;如果原始数据是字符串文字,或者需要保留原始数据,则需要制作副本并处理该副本
注意,由于strok的工作方式,您不能“嵌套”调用;也就是说,您不能将第一个键值对标记化,然后将其拆分为键值标记,然后获取下一个键值对。您必须首先标记所有键值对,然后依次处理每个键值对 您可以首先在
,
上标记,将内容拆分为3个不同的字符串,然后在“=”上标记这些字符串中的每一个:
char *kvpair[N] = {NULL}; // where N is large enough for the expected
// number of key-value pairs
char *tok = strtok(input, ",");
size_t kvcount = 0;
while (tok != NULL && kvcount < N)
{
kvpair[kvcount++] = tok;
tok = strtok(NULL, ",");
}
...
for (i = 0; i < kvcount; i++)
{
char delim = '[';
char *key = strtok(kvpair[i], "=");
char *val = strtok(NULL, "=");
printf("%c%s", delim, val);
delim = ',';
}
putchar(']');
char*kvpair[N]={NULL};//其中,N足够大,以满足预期的
//键值对的数目
char*tok=strtok(输入“,”);
大小\u t kvcount=0;
while(tok!=NULL&&kvcount
这只是一个粗略的草图;它假定提前知道最大的键值对数,它不会尝试处理空键或值,也不会真正进行任何类型的错误处理。但它应该为你指明正确的方向
记住,strok
修改其输入;如果原始数据是字符串文字,或者需要保留原始数据,则需要制作副本并处理该副本
注意,由于strok的工作方式,您不能“嵌套”调用;也就是说,您不能将第一个键值对标记化,然后将其拆分为键值标记,然后获取下一个键值对。您必须首先标记所有键值对,然后依次处理每个键值对 将
,
标记化,然后使用for循环,得到=
后面的子字符串。将,
标记化,然后使用for循环,得到=
后面的子字符串。有点迂腐,但是找到第一个=,然后找到后面的,然后得到wo