URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7352
[ Назад ]

Исходное сообщение
"Как разбить строку char на две переменные типа char?"

Отправлено bab , 05-Май-08 18:48 
Код на С/С++
Есть строка
char sometext[50]="111.111.111.111 hostname";
её падо поделить на две переменные (например: char Ip[25] и host[25])
Как это сделать по проще? Думаю просто найти вхождение пробела и при помощи его индекса найти два субстринга.
Уверен что это можно сделать проще при помощи какого нить sscanf, scanf или как нить ещё.
У кого какие идеи?
Спасибо.

Содержание

Сообщения в этом обсуждении
"Как разбить строку char на две переменные типа char?"
Отправлено vic , 05-Май-08 19:04 
>Код на С/С++

либо С, либо С++, пора уже определится.
решение задачи в главе 'строки' любой книжки для начинающих по С, либо С++.


"Как разбить строку char на две переменные типа char?"
Отправлено bab , 05-Май-08 20:01 
Разницы нет. Приоритет на C++, но жет быть и С. Можна оба. Любой простой вариант.

"Как разбить строку char на две переменные типа char?"
Отправлено phpcoder , 05-Май-08 23:02 
>Код на С/С++
>Есть строка
>char sometext[50]="111.111.111.111 hostname";
>её падо поделить на две переменные (например: char Ip[25] и host[25])
>Как это сделать по проще? Думаю просто найти вхождение пробела и при
>помощи его индекса найти два субстринга.
>Уверен что это можно сделать проще при помощи какого нить sscanf, scanf
>или как нить ещё.
>У кого какие идеи?
>Спасибо.

Сходу, что пришло в голову, сам не проверял:

char sometext[]="111.111.111.111 hostname";
char *space_pos = NULL;
char *ip = NULL;
char *hostname = NULL

space_pos = strchr(sometext, ' ');
if (space_pos == NULL) {
   assert(0 && "sometext should always contains as minimum one space");
}

hostname = strdup(space_pos + 1);
space_pos = '\0';
ip = strdup(sometext);

Короче. нигде в задании не было условия что строку модифицировать нельзя, так что я решил немного её изменить для пущего удобства.

Потом ещё нужно не забыть сделать free(hostname) и free(ip).

На С++ можно примерно также, только используя необходимые конструкторы std::string


"Как разбить строку char на две переменные типа char?"
Отправлено bab , 06-Май-08 01:06 
Задача сделать всё как можно проще. Как я и предпологал sscanf тут нужен. Просто работай завален, небыло времени поманить.
//============================================================
#include <stdio.h>

int main ()
{
  char Sometext[]="111.111.111.111 hostname";
  char Ip[20], Host[20];
  sscanf (Sometext,"%s %s",Ip,Host);

  printf ("Ip: %s Host: %s\n",Ip,Host);//Vivodim vsio srazu
  
  return 0;
}
//==========================================================
Попутный вопрос чтоб топиками не мусарить.
Как можно найти исходники в линукс? Например интересует `ifconfig` и `ls`.


"Как разбить строку char на две переменные типа char?"
Отправлено phpcoder , 06-Май-08 09:30 
>Как можно найти исходники в линукс? Например интересует `ifconfig` и `ls`.

Скачайте исходники соответствующих пакетов:

[c0der@mvo ~]$ rpm -qf =ls =ifconfig --qf '%{NAME} %{URL}\n'              12:29
coreutils http://www.gnu.org/software/coreutils/
net-tools http://www.tazenda.demon.co.uk/phil/net-tools


"Как разбить строку char на две переменные типа char?"
Отправлено parad , 06-Май-08 09:59 
лучше бы не советовал. честно, извини, не удержался.

"Как разбить строку char на две переменные типа char?"
Отправлено parad , 06-Май-08 09:57 
+1

ЗЫ. Пацаны, вы загнули с sscanf, выделением памяти и количеством переменных!

//------------- CUT
char *host, *ip = "10.10.10.10 domain.com"

host = strchr (iphost, ' ');
if (host)
    *(host++) = '\0';

//------------- CUT

Теперь в ip храниться ип, в host - хост.


"Как разбить строку char на две переменные типа char?"
Отправлено bab , 12-Май-08 22:47 
Parad хороший пример. sscanf  думаю более мощный, но твой тоже хороший, только с маленькой ошибочкой.

"Как разбить строку char на две переменные типа char?"
Отправлено Ivanoff , 13-Май-08 10:31 
>//------------- CUT
>char *host, *ip = "10.10.10.10 domain.com"
>
>host = strchr (iphost, ' ');
>if (host)
>    *(host++) = '\0';
>
>//------------- CUT
>

Все гениальное просто! :) Класс...