域名解析

时间:2013-01-12 12:50:50

标签: c regex parsing

我有这段代码:

        #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列表?

2 个答案:

答案 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