2012-05-27 3 views
1

Я написал небольшую программу на C, чтобы получить IP от удаленного пользователя, войти в SSH сессиюКак PRINTF() только первая часть строки

Код:

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 Addr а не остальную часть строки. Я не могу понять, как вырезать строку, чтобы напечатать только первую часть (255.255.255.255)

Я весь поиск решения день, но без успеха:/

Спасибо за любую помощь:)

ОБНОВИТЬ !

я обнаружил, что вместо SSH_CLIENT вы можете использовать RemoteHOST:)
Но решение Larsks очень полезно и стоит вспомнить

+0

GetEnv ("REMOTE_ADDR"); – MilkyWayJoe

+0

@MilkyWayJoe, что заставляет вас думать, что будет переменная 'REMOTE_ADDR'? Это ssh, а не Apache. – larsks

ответ

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; 

Но это не совсем понятно, и было бы сложнее выполнить правильную проверку ошибок.

+0

Larsks спасибо! Ваш ответ сохранит мой день:). Нет, я читаю о strchr, потому что я никогда не использую эту функцию. –

+1

-1 вы проверяете не для другого разделителя-символа, чем '', например. '\ Т'; вы проверяете не на возврат NULL; также вы должны посмотреть на стандарт: * Приложение должно гарантировать, что оно не изменит строку, на которую указывает функция getenv(). * – user411313

+0

'printf ("%. * s \ n ", strchr (getIP, '') - getIP, getIP); 'печатает IP-адрес без изменения какого-либо состояния. Вы можете также рассмотреть возможность добавления проверки ошибок для strchr, чтобы убедиться, что переменная среды фактически содержит пробел. –

0

Вы можете разобрать строку, возвращаемую getenv() с помощью strtok(), разделяя строку на пробелы. Первый токен, который вы получаете, - это IP-адрес.

0

Вы должны никогда изменить GetEnv-результат

int main() { 

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

Этот код не работает. У меня нет результатов на выходе: / –

Смежные вопросы