0

我有这个代码:

        #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”作为最终结果。

如何让它正确检测它是子域还是域?也许如果我包括一个已知 tlds 的列表?

4

2 回答 2

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 )or puts( dot + 1 )。(puts这里更好,但你可能更熟悉printf

于 2013-01-12T12:58:21.383 回答
1

要确定它是否是子域,请计算主机名中以句点分隔的令牌数。正如上面的评论所指出的,这并没有考虑到 foo.on.ca 之类的东西。

于 2013-01-12T12:56:22.707 回答