سؤال
فيما يلي، أحاول تقسيم السلسلة دون إنشاء نسخ باستخدام strok
#include <string.h>
void func(char *c)
{
char *pch = strtok (c,"#");
while (pch != NULL)
{
pch = strtok (NULL, "#");
}
}
int main()
{
char c[] = "a#a\nb#b\n";
char *pch = strtok (c,"\n");
while (pch != NULL)
{
char *p = new char[strlen(pch)+1];
strcpy(p, pch);
func(p); //copy of pch
pch = strtok (NULL, "\n"); //fails to get pointer to 'b#b'
}
}
المحلول
امم... strtok()
قد يقوم بتخزين السلسلة المميزة في مخزن مؤقت ثابت.وبالتالي عندما الثانية strtok()
ويسمى في func()
, نتائج العملية الأولى (في main()
) يبدو أن تضيع.نلقي نظرة على strtok_r()
.
نصائح أخرى
يستخدم strtok متغيرات ثابتة، وبالتالي لا يمكنه العمل مرة أخرى ولا يكون آمنًا على الإطلاق.strtok_r ليس C89/C99 فقط POSIX.
لا تنتمي إلى StackOverflow