2013-01-12 69 views
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”作为最终结果。

如何正确检测它是否是子域或域?也许如果我包含已知的tld列表?

+0

这与正则表达式有什么关系?你只是在一个字符上进行标记 – Mark

+0

我以前用其他编程语言的正则表达式来做这件事,我认为在c –

+0

中有类似的东西,但是这不是你的问题请求 – Mark

回答

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

+0

你的论点是非常有用的,我会尽快考虑如何做到这一点:) –

1

确定它是否为子域计数主机名称中由句点分隔的令牌数量。正如在上面的评论中指出的那样,这并没有考虑foo.on.ca这样的东西。

+0

我很乐意这样做,但我在本地c有点nb。只是想修改一些东西。 C不是我当前的编程语言 –

+0

您的token_counter变量中包含计数。 –