Ваш подход к использованию strtok_r
или strtok
для разделения имен не работает.
После того, как вы токенизируете (полное) имя, вы получите следующее:
name="Konstantina Pavlova Rusenkova"
Выполучить это имя по name = strtok(NULL, ":,");
. Поэтому он не может содержать никаких ','
. Если бы был ','
, то строка была бы там разрезана.
Любая дальнейшая токенизация с использованием разделителя ','
не может получить никакого полезного результата, кроме как вернуть саму полную строку.
Это означает, что во внутреннем цикле tmps = strtok(tmps, ",");
ничего не будет делать.
Я добавил несколько отпечатков:
printf("name=%s\n",name);
if(atoi(uid) > 999)
{
for(tmps = strtok_r(name, " ", &rest);
tmps != NULL;
tmps = strtok_r(NULL, ",", &rest))
{
printf("tmps:%s\n", tmps);
tmps = strtok(tmps, ",");
printf(" [%s]\n", tmps);
}
}
Результат:
name=Konstantina Pavlova Rusenkova
tmps:Konstantina
[Konstantina]
tmps:Pavlova Rusenkova
[Pavlova Rusenkova]
Второй отпечаток показывает, что вы вводите в tmps=strtok(tmps,",");
. Как упомянуто выше, разделитель никогда не присутствует, оставляя все во вторых скобках.
Как правило, strtok
и friends бесполезны для разделения имени. Если разделить строки, не оставляя двух имен вместе. Пробел заменяется на \0
.
Вместо этого вы можете просто найти последний пробел и разбить его там:
if(atoi(uid) > 999)
{
char *first = name;
char *last = strrchr(name,' ');
if (last != NULL)
{
*last = 0;
last++;
printf("[%s] [%s]\n", first, last);
}
}
Это даст
name=Konstantina Pavlova Rusenkova
[Konstantina Pavlova] [Rusenkova]
Itтакже по-прежнему работает с именами только с одним именем:
name=James Kirk
[James] [Kirk]
Если имеется всего одно имя, вам нужно немного адаптировать.
Примечание:
Еслипо какой-то причине вы настаиваете на использовании strtok
также для разделения имени, вам необходимо использовать разделитель ' '
, а затем склеить первую и вторую подстроку.
Это будет выглядеть так:
if(atoi(uid) > 999)
{
for(tmps = strtok_r(name, " ", &rest);
tmps != NULL;
tmps = strtok_r(NULL, " ", &rest))
{
printf("tmps:%s\n", tmps);
printf(" [%s]\n", tmps);
}
}
с выходом
name=Konstantina Pavlova Rusenkova
tmps:Konstantina
[Konstantina]
tmps:Pavlova
[Pavlova]
tmps:Rusenkova
[Rusenkova]