- 确保您可以在打印时确定打印内容的限制。
- 在打印消息的末尾输出换行符;如果您这样做,信息更有可能及时出现。
- 不要将 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;
}
或者(优化,由自我提供。):
#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: <<>>
请注意在最后两个示例中标记是如何为自己付出代价的。没有标记,你无法区分它们。