Проблема с указателями в реализации парсинга "на лету"
Код:
domain:port\n
Я ее получаю и тут же разделяю: пока не встретил двоеточие, записываю символы в *domain, после него и до \n - в port. Реализую с помощью динамической памяти ради саморазвития, предполагая, что длина и домена, и порта может быть больше чем ожидается.
Код:
char buf;
int res;
int size=1;
char * domain=(char*)calloc(1,sizeof(char));
char * port=(char*)malloc(sizeof(char));
// Просто экспериментирую. В курсе, что некорректно выделять и потом перевыделять на тот же размер(первое прохждение цикла)
while((res=recv(s,&buf,1,0))>0)
{
if(isdomain){
if(buf!=':'){
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)=buf;
size++;
}
else{ isdomain=false; size=1;}
}
else if(buf!='\n'){
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)=buf;
size++;
}
}
int res;
int size=1;
char * domain=(char*)calloc(1,sizeof(char));
char * port=(char*)malloc(sizeof(char));
// Просто экспериментирую. В курсе, что некорректно выделять и потом перевыделять на тот же размер(первое прохждение цикла)
while((res=recv(s,&buf,1,0))>0)
{
if(isdomain){
if(buf!=':'){
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)=buf;
size++;
}
else{ isdomain=false; size=1;}
}
else if(buf!='\n'){
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)=buf;
size++;
}
}
Программа выводит следующее:
Код:
domain.ru¤¤¤¤лллллллл:1234¤¤¤¤лллллллл
Сколько ни бился - ничего не помогает. Как от этого избавиться? Спасибо.
А завершающий ноль? Забыл?
Код:
while(recv(buf.....)
{
...
char*dots=strchr(buf,':');
char*lf=strchr(buf,'\n');
if(dots&&lf)
{
int len=dots-buf;
char*domain=(char*)malloc(len+1);
strncpy(domain,buf,len);
domain[len+1]=0;
len=lf-dots;
char*port=(char*)malloc(lf-dots+1);
strncpy(port,dots+1,len);
port[len+1]=0;
}
...
}
{
...
char*dots=strchr(buf,':');
char*lf=strchr(buf,'\n');
if(dots&&lf)
{
int len=dots-buf;
char*domain=(char*)malloc(len+1);
strncpy(domain,buf,len);
domain[len+1]=0;
len=lf-dots;
char*port=(char*)malloc(lf-dots+1);
strncpy(port,dots+1,len);
port[len+1]=0;
}
...
}
Если содержимое buf не важно после выполнения преобразования, то можно еще упростить.
Код:
char*dots=strchr(buf,':');
char*lf=strchr(buf,'\n');
if(dots&&lf)
{
char*domain=buf;
*dots=0;
char*port=dots+1;
*lf=0;
}
char*lf=strchr(buf,'\n');
if(dots&&lf)
{
char*domain=buf;
*dots=0;
char*port=dots+1;
*lf=0;
}
Пример писал без проверки, поэтому если обнаружаться ошибки, прошу меня простить - отладка поможет :)
Удачи
Цитата: SMiX
Соединяюсь с сокетом, который сразу при подключении выводит мне строку вида
Я ее получаю и тут же разделяю: пока не встретил двоеточие, записываю символы в *domain, после него и до \n - в port. Реализую с помощью динамической памяти ради саморазвития, предполагая, что длина и домена, и порта может быть больше чем ожидается.
Программа выводит следующее:
Сколько ни бился - ничего не помогает. Как от этого избавиться? Спасибо.
Код:
domain:port\n
Я ее получаю и тут же разделяю: пока не встретил двоеточие, записываю символы в *domain, после него и до \n - в port. Реализую с помощью динамической памяти ради саморазвития, предполагая, что длина и домена, и порта может быть больше чем ожидается.
Код:
char buf;
int res;
int size=1;
char * domain=(char*)calloc(1,sizeof(char));
char * port=(char*)malloc(sizeof(char));
// Просто экспериментирую. В курсе, что некорректно выделять и потом перевыделять на тот же размер(первое прохждение цикла)
while((res=recv(s,&buf,1,0))>0)
{
if(isdomain){
if(buf!=':'){
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)=buf;
size++;
}
else{ isdomain=false; size=1;}
}
else if(buf!='\n'){
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)=buf;
size++;
}
}
int res;
int size=1;
char * domain=(char*)calloc(1,sizeof(char));
char * port=(char*)malloc(sizeof(char));
// Просто экспериментирую. В курсе, что некорректно выделять и потом перевыделять на тот же размер(первое прохждение цикла)
while((res=recv(s,&buf,1,0))>0)
{
if(isdomain){
if(buf!=':'){
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)=buf;
size++;
}
else{ isdomain=false; size=1;}
}
else if(buf!='\n'){
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)=buf;
size++;
}
}
Программа выводит следующее:
Код:
domain.ru¤¤¤¤лллллллл:1234¤¤¤¤лллллллл
Сколько ни бился - ничего не помогает. Как от этого избавиться? Спасибо.
Pastor +1.
А надо realloc делать на размер больший на 1, и в последний элемент массива-строки вписывать '\0'.
Тогда будет Ок.
To grgdvo:
Если уз считывать сначала все в один буфер, а потом по нему искать,
то я бы лучше использовал std::string :))
grgdvo, мне кажется, что реализация этого дела с чтением по 1 байту лучше, т.к. она универсальней. Например, если предположить, что сервер может дать не domain:port\n, а user:pass@domain:port\n
Вот исправленный код
Код:
char buf;
int res;
int size=1;
bool isdomain=true;
char * domain=(char*)calloc(2,sizeof(char));
char * port=(char*)malloc(sizeof(char)*2);
while((res=recv(s,&buf,1,0))>0)
{
if(isdomain){
if(buf!=':'){
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)=buf;
size++;
}
else{
isdomain=false;
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)='\0';
size=1;
}
}
else if(buf!='\n'){
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)=buf;
size++;
}else{
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)='\0';
}
}
cout<<domain<<':'<<port<<endl;
int res;
int size=1;
bool isdomain=true;
char * domain=(char*)calloc(2,sizeof(char));
char * port=(char*)malloc(sizeof(char)*2);
while((res=recv(s,&buf,1,0))>0)
{
if(isdomain){
if(buf!=':'){
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)=buf;
size++;
}
else{
isdomain=false;
domain=(char*)realloc(domain,size*sizeof(char));
*(domain+size-1)='\0';
size=1;
}
}
else if(buf!='\n'){
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)=buf;
size++;
}else{
port=(char*)realloc(port,size*sizeof(char));
*(port+size-1)='\0';
}
}
cout<<domain<<':'<<port<<endl;