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