c - 如何使用 strtok 剪切大小不同的字符串?

标签 c string strtok

所以,我是 C 的新手,我得到一个像这样的字符串作为输入 a:name:number:number:number:number:name:name 我正在使用 strtok获取所有没有 ":" 的姓名和号码。问题是,字符串的大小可以变化,并且最多可以有 2 个名称(总是在末尾),例如:a:name:number:number:number:number:name:name:namea:name:number:number:number:number:name:name:name:name

现在,我正在使用结构和 strcpy 来获取结构中的每个名称,但由于名称的数量最终发生变化,当最后的名称少于 4 个时,我会出现段错误,这是名称的最大数量(最小为 1),我认为这是因为我在字符串结束后继续执行 strtok。

这是我的代码:

char *token;
structname a;
token = strtok(c,":"); //c is the input string
strcpy(a.name1,strtok(NULL,":"));
a.number1 = atoi(strtok(NULL,":"));
a.number2 = atoi(strtok(NULL,":"));
a.number3 = atoi(strtok(NULL,":"));
a.number4 = atoi(strtok(NULL,":"));
strcpy(a.name2,strtok(NULL,":"));
strcpy(a.name3,strtok(NULL,":"));
strcpy(a.name4,strtok(NULL,":"));
strcpy(a.name5,strtok(NULL,":"));

因此,我猜测错误的发生是因为在没有 4 个中间名的情况下,即使在字符串结束后它仍继续执行 strtok? 我想知道我该怎么做,例如,在末尾有 2 个名称的情况下,只需将 a.name4a.name5 获取到 "\0" 或者只是不在这些字符串中获取任何内容。 感谢您的时间和帮助!

最佳答案

通常,strtok 在循环中使用。例如:

char *token = strtok(input_string, ".");
while(token != NULL) {
    //do code
    token = strtok(NULL, ".");
}

这样,循环会在第一次解析失败时结束。 strtok 应该在您使用它的任何时候在输入字符串结束后继续返回 NULL,所以这不应该导致问题,但它可能是。

在我看来,最有可能的问题是您在 strcpy 中使用 strtok 的方式。 strcpy 可能失败,因为源字符串为 NULL。如果您不想使用循环,我会做的是

token = strtok(NULL, ":");
strcpy(a.name2, token);

这样,您可以在尝试复制之前确保它不是 NULL 指针。 strcpy 适用于空字符串 (""),但不适用于 NULL 指针。

您可能需要检查的另一件事是目标字符串(a.name2 等)是否分配了足够的空间。否则,这也会导致段错误。

关于c - 如何使用 strtok 剪切大小不同的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55384990/

相关文章:

c - 为什么我的二进制数无法正确转换为十六进制?

java - 如何检查字符串是否包含两个星号字符?

java - Java 中将变量传递给参数的魔术

C strtok 解析复杂字符串

c++ - GNU C/C++ 编译器更改包括搜索顺序

c - Linux 原始套接字缓冲区大小是否有 256 K 的上限?

javascript - 如何替换除 JavaScript 中第一个字符串之外的所有字符串?

c - 如何创建一个由使用 strtok 函数创建的标记组成的数组?

c - *str 和 atoi(str) 的区别

c - 如何在线程/进程之间可移植地共享变量?