- Уверете се, че можете да определите границите на това, което печатате, когато печатате.
- Извежда нови редове в края на отпечатаните съобщения; е по-вероятно информацията да се появи навреме, ако направите това.
- Не отпечатвайте NULL указатели като низове; не всички версии на
printf()
ще се държат добре — някои от тях изхвърлят ядро.
Код:
#include <stdio.h>
#include <string.h>
int main(void)
{
char abc[] = "ls &";
char *tok;
char *ptr = abc;
while ((tok = strtok(ptr, " ")) != NULL)
{
printf("<<%s>>\n", tok);
ptr = NULL;
}
return 0;
}
Или (оптимизирано, с любезното съдействие на self.):
#include <stdio.h>
#include <string.h>
int main(void)
{
char abc[] = "ls &";
char *tok = abc;
while ((tok = strtok(tok, " ")) != NULL)
{
printf("<<%s>>\n", tok);
tok = NULL;
}
return 0;
}
Изход:
<<ls>>
<<&>>
Можете да изберете свои собствени знаци за маркери, но когато не се забърквате с XML или HTML, намирам двойните ъглови скоби за сравнително добри за работата.
Можете също така да използвате структурата на цикъла си с цената на писане на второ извикване до strtok()
(което е минимална цена, но може да се твърди, че нарушава принципа DRY: Не се повтаряйте):
#include <stdio.h>
#include <string.h>
int main(void)
{
char abc[] = "ls &";
char *tok = strtok(abc, " ");
while (tok != NULL)
{
printf("<<%s>>\n", tok);
tok = strtok(NULL, " ");
}
return 0;
}
Същият изход.
Ревизирано изискване
Бих искал да добавя израз printf()
извън цикъла while
и да отпечатам '&
' отвън. Трябва ми, тъй като искам да го сравня по-късно с друга променлива в програмата. Има ли някакъв начин да го направите?
Да, обикновено има начин да направите почти всичко. Това изглежда работи. Също така работи разумно, ако има повече токени за анализ, или ако има само &
за анализ, или ако няма токени. Ясно е, че тялото на външния цикъл може да се превърне във функция, ако желаете; дори би било разумно да го направим.
#include <stdio.h>
#include <string.h>
int main(void)
{
char tests[][16] =
{
"ls -l -s &",
"ls &",
"&",
" ",
""
};
for (size_t i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
{
printf("Initially: <<%s>>\n", tests[i]);
char *tok1 = strtok(tests[i], " ");
char *tok;
while ((tok = strtok(NULL, " ")) != NULL)
{
printf("Loop body: <<%s>>\n", tok1);
tok1 = tok;
}
if (tok1 != NULL)
printf("Post loop: <<%s>>\n", tok1);
}
return 0;
}
Изход:
Initially: <<ls -l -s &>>
Loop body: <<ls>>
Loop body: <<-l>>
Loop body: <<-s>>
Post loop: <<&>>
Initially: <<ls &>>
Loop body: <<ls>>
Post loop: <<&>>
Initially: <<&>>
Post loop: <<&>>
Initially: << >>
Initially: <<>>
Обърнете внимание как маркерите плащат за себе си в последните два примера. Не можете да ги различите без маркерите.
person
Jonathan Leffler
schedule
21.09.2013
while
цикъл продължава, докатоtok
станеNULL
, нали? Така че във втория изразprintf
,tok
еNULL
. Това изненадващо ли е? - person rici   schedule 21.09.2013strtok()
, винаги можете да консултирате се с документацията. - person WhozCraig   schedule 21.09.2013printf()
? И след като сте написали това, какво мислите, чеprintf("\n\n\n\n\n%s", NULL);
ще направи, тъй като сте гарантирани, че това ще бъде изпълнено? Отървете се от второтоprintf
и просто отпечатвайте всеки жетон, докато не остане повече. - person WhozCraig   schedule 21.09.2013strcmp(tok, "&") == 0
. Ако изчакате доtok == NULL
, тогава вторият printf няма какво да отпечата. - person Barmar   schedule 21.09.2013