我有这段代码:
#include <stdio.h>
#include <string.h>
int main()
{
char buf[255];
char buf2[255];
char myhost[255] = "subdomain.domain.com";
char *pch;
int token_counter = 0;
memset(buf, 0, 255);
memset(buf2, 0, 255);
pch = strtok(myhost, ".");
while (pch != NULL)
{
pch = strtok(NULL, ".");
if (pch == NULL)
{
memset(buf, 0, 255);
strncpy(buf, buf2, strlen(buf2) - 1);
break;
}
token_counter++;
strcat(buf2, pch);
strcat(buf2, ".");
}
printf("Domain: %s\n", buf);
return 0;
}
如果将myhost定义为subdomain.domain.com,则此工作正常,但如果它是domain.com,则显示“com”作为最终结果。
如果它是子域名或域名,如何才能正确检测?也许如果我列出已知的tld列表?
答案 0 :(得分:1)
确定它是否是子域计数主机名中由句点分隔的标记数。正如上面的评论所指出的,这并不考虑像foo.on.ca这样的事情。
答案 1 :(得分:1)
strtok
过度,strcat
是浪费。如果您只想打印第n个.
之后的所有内容,请使用strchr
或只检查字符串以找到第n个.
。如果需要,请从字符串末尾开始计算。
让我解释为什么strcat
在这里浪费时间。考虑:
const char *name = "foo.bar.baz.qux.net";
printf( "%s\n", name + 8 );
如果要打印“baz.qux.net”,则不需要将该字符串复制到新缓冲区中,因为您已经有一个指向所需字符串的第一个字符的指针。用你拥有的。您需要做的就是在字符串中找到指向所需.
的指针,然后执行printf( "%s\n", dot + 1 )
或puts( dot + 1 )
。 (puts
在这里更好,但您可能更熟悉printf
)