如何printf()只是字符串的第一部分

时间:2012-05-27 00:57:42

标签: c ip printf cut

我在C中编写了一个小程序,用于从登录SSH会话的远程用户获取IP

代码:

int main (){
    char * getIP ;
    getIP = getenv ("SSH_CLIENT");
    printf ("%s", getIP);
    printf("\n");
    return 0;
}

效果很好,输出我

shell# ./a.out

192.168.1.33 39840 22

但我想只打印IP地址而不打印其余字符串。我无法弄清楚如何剪切字符串只打印第一部分(255.255.255.255)

我搜索一整天的解决方案,但没有成功:/

感谢您的帮助:)

更新!

我发现SSH_CLIENT可以使用REMOTEHOST:) 但Larsks解决方案非常有用,值得记住

3 个答案:

答案 0 :(得分:2)

你甚至不需要strtok()来做这件事,因为你所关心的只是空格之前的第一个字符串。使用strchr()找到第一个空格,将其设置为NUL,然后就完成了:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main (){
    char *getIP, *mark;
    int i;
    getIP = getenv ("SSH_CLIENT");

    // get the location of the first space character
    mark = strchr(getIP, ' ');

    // set it to 0 (ascii NUL)
    *mark = 0;
    printf ("%s\n", getIP);
    return 0;
}

你可以通过这样做实际崩溃:

*(strchr(getIP, ' ')) = 0;

而不是:

mark = strchr(getIP, ' ');
*mark = 0;

但这并不是那么清楚,并且进行适当的错误检查会更难。

答案 1 :(得分:0)

您可以使用getenv()拆分strtok()返回的字符串,将字符串拆分为空格。您获得的第一个令牌是IP地址。

答案 2 :(得分:0)

你应该从不更改getenv-result

int main() {

  char firstword[BUFSIZ], *getIP = getenv("SSH_CLIENT");
  if( getIP )
  {
    sscanf( getIP , "%*s", BUFSIZ-1, firstword );
    puts(firstword);
  }
    return 0;
}