繁体   English   中英

标记AC字符串

[英]Tokenize a c string

我正在尝试获取/ xxx /之后的字符串thet,必须有一个正斜杠,其中两个,然后是我需要提取的字符串。 这是我的代码,但是我不知道在哪里设置空终止符,这里有一个数学问题

char str[100] = "/709/usr/datapoint/nviTemp1";
char *tmp;
char token[100];

tmp = strchr(str+1, '/');
size_t len = (size_t)(tmp-str)+1;
strncpy(token, str+len, strlen(str+len));
strcat(token,"\0");

我想提取/709/之后的任何内容,它是usr/datapoint/nviTemp1

请注意,/ 709 /是可变的,并且可以是任何大小,但可以肯定会有两个正斜杠。

如果您确定字符串以`“ / NNN /”开头,那么很简单:

char str[100] = "/709/usr/datapoint/nviTemp1";
char token[100];
strcpy(token, str+5);  // str+5 is the first char after the second slash.

如果您需要在第二个斜杠之后获取所有内容,请执行以下操作:

char str[100] = "/709/usr/datapoint/nviTemp1";
char token[100];
char* slash;
slash = strchr(str, '/');     // Expect that slash == str
slash = strchr(slash+1, '/'); // slash is second slash.
strcpy(token, slash+1);      // slash+1 is the string after the second slash.

您可以使用sscanf

sscanf(str,"%*[/0-9]%s",token);  
 /* '/709/' is read and discarded and remaining string is stored in token */

token将包含字符串"usr/datapoint/nviTemp1"

工作实例

简单改进:

char str[100] = "/709/usr/datapoint/nviTemp1";
char *tmp;
char token[100];

tmp = strchr(str+1, '/');
if (tmp != NULL) strncpy(token, tmp + 1, sizeof(token)); else token[0] = '\0';

tmp将斜线指向"/709" ,因此您想要的就是紧随其后的内容。 您不必手动计算长度。

此外, strncpy最多复制(第三个参数)字符,因此它应该是目标缓冲区的长度。

您可以使用计数器和基本的while循环:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc < 2) return 0;

    char *s = argv[1];
    char slash = '/';
    int slash_count = 0;

    while (slash_count < 2 && *s)
        if (*s++ == slash) slash_count++;

    printf("String: %s\n", s);

    return 0;
}

然后,您可以使用s指针做任何您想做的事情,例如用strdup复制它或使用strcatstrcpy等。

输出:

$ ./draft /709/usr/datapoint/nviTemp1
String: usr/datapoint/nviTemp1
$ ./draft /70905/usr/datapoint/nviTemp1
String: usr/datapoint/nviTemp1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM