【发布时间】:2018-03-01 12:37:49
【问题描述】:
我有一个包含数据类型和变量地址的字符串。这些值由“///”分隔,并且它们是交替的(类型 /// 地址 /// 类型 /// 地址 ...)。这些元组的数量不是固定的,并且可能因执行而异。
现在我的问题是如何在循环中处理字符串,因为 strtok 需要首先使用原始字符串调用,然后使用 NULL 参数,但在循环中必须调用两次。因此,在第一个循环 strtok 被调用 3 次之后,这会导致 strtok 执行的计数不均匀,而它应该是偶数。我试图通过处理循环外的第一个元组来解决这个问题(因为 strtok 必须用原始字符串调用)并处理循环内的剩余元组。
char mystring[128];
char seperator[] = "///";
char *part;
int type [128];
int address [128];
number_of_variables = 0;
part = strtok(mystring, seperator);
type[number_of_variables] = (int) atoi(part);
part = strtok(NULL, seperator);
address[number_of_variables] = (int)strtol(part, NULL, 16);
while(part != NULL){
part = strtok(NULL, seperator);
type[number_of_variables] = (int) atoi(part);
part = strtok(NULL, seperator);
address[number_of_variables] = (int)strtol(part, NULL, 16);
number_of_variables++;
}
所以现在我的 strtok 执行次数是偶数,但是如果我的字符串包含例如 2 个元组,它将第二次进入循环,因此第五次调用 strtok,这会导致程序在 atoi() 获取时崩溃一个错误的指针。
编辑: mystring 示例:
"1///0x37660///2///0x38398"
1 和 2 是后续程序的类型标识符。
【问题讨论】:
-
你能提供一些输入字符串的例子吗?
-
为什么在调用
atoi之前不检查part = strtok(NULL, seperator);的结果是否为NULL? -
您知道
strtok将第二个参数视为要查找的单字符分隔符列表,而不是可能会查找的单分隔符一个字符串?因此,分隔符为"///",字符串为"1///0x37660/..." it's going to see a 1, then NULL, then NULL, then "0x37660". See the manual page forstrtok`。 -
添加到@lurker 的评论中,您可能想要使用
strstr(),它与strtok()不同的是,它是可重入的,适用于常量字符串(它不会修改它的参数 ) 并且您可以使用任何字符串作为分隔符。 -
是的,弗拉德的解决方案将有效,因为他正确处理了
strtok。