что делать? (не могу понять...)

Модератор: Модераторы разделов

ilya--

что делать?

Сообщение ilya-- »

После вырезания текста с помощью memcpy(char *string2, char *string1,1) в конце строки string2 появляются непонятные символы... string1 получается с помощью read(), которая читает данные из сокета. Откуда взялись эти символы??? :new_huh:
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: что делать?

Сообщение Jan2ary »

А string2 как объявлен и как использовался до вызова memcpy? Вполне возможно, что это просто мусор, который в памяти завалялся...
Если точно знаешь что там должен быть один символ, можно
*(string2 + 1) = '\0'

Давно на С не писал, камнями не бить. :new_unsure:
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: что делать?

Сообщение Shura »

дело в том, что любая строка в С должна завершаться нулем. Если строка не завершается нулем, то программа просто не знает где у строки конец. В твоем случае в string2 после полезной информации идет мусор (ты ведь память забыл обнулить!) вот его ты и видишь.

После копирования в твоем случае надо поставить string[1]=0;

PS Скажу по секрету, у тебя не вырезание, а копирование ;-)
Rock'n'roll мертв © БГ
Спасибо сказали:
ilya--

Re: что делать?

Сообщение ilya-- »

Вот текст проги:
#include <stdio.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>

/* Ignore terminal I/O signals */
int main(void)
{
signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
/* Ignore terminal I/O signals */

int pid;
int sock;
int new_port;
int i;
size_t size_client;
struct sockaddr_in name;
struct sockaddr_in name_client;
char from_client[100];
char *strtmp;
char rd_simb[1]; //single readable simble
pid = fork();
if (pid != 0) exit(0); /* this is the parent process here, so let's exit it for our daemon work */

setsid(); /* child process, so let's make us a session leader, and lose control tty */
signal(SIGHUP, SIG_IGN); /* SIGHUP will be sent to child process so ignore it */
/*socket procedure*/
sock=socket(PF_INET,SOCK_STREAM,0);
name.sin_family=AF_INET;
name.sin_port=htons(27);
name.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
if(bind(sock, (struct sockaddr *)&name, sizeof(name))<0){
printf("UNlucky...\n");
shutdown(sock,2);
}
else
{
printf("LUCKY!\n");
listen(sock,1); printf("listen...OK!");
new_port=accept(sock,(struct sockaddr*)&name_client, &size_client); printf("accept...OK! \n");
printf("client port Number:%d\n server port number:%d",ntohs(name_client.sin_port),new_port);
read(new_port,from_client,100);
//Get variables
for(i=1; i<strlen(from_client)-6; i++){
memcpy(rd_simb,from_client+i,1);
printf("\nsimb:%s\n",rd_simb);
}

//End: Get variables
/*socket procedure*/
shutdown(sock, 2);
}
if (pid != 0) exit(0);


/* this is the main daemon process, also the grand child process */
return 0;
}
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: что делать?

Сообщение elide »

ну и нафига нам твоя программа?
тебе же сказали - закрой строку нулем и будет тебе счастье. почему ты еще этого не сделал?

Код: Выделить всё

 for(i=1; i<strlen(from_client)-6; i++){
memcpy(rd_simb,from_client+i,1);
printf("\nsimb:%s\n",rd_simb);
}
я тоже хочу такую траву!!!!
нафига копировать и выводить строку посимвольно?
да еще и оставляя ее при этом строкой?
про вызов strlen на каждой итерации я уже молчу....

почемуб тебе не сделать так

Код: Выделить всё

for(i=1, sl=strlen(from_client)-6; i<sl; ++i){
printf("\nsimb:%c\n",from_client[i]);
}
а?
слава роботам!
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: что делать?

Сообщение Shura »

кстати, не факт, что strlen будет вызываться каждый цикл. Компилятор может соптимизировать. Но, конечно, "на бога надейся, да сам не плошай" ;-)
Shura добавил в 25.01.2005 16:20
Для ilya--:
Все-таки купи книжку по С/С++. Больше половины вопросов точно отпадет. Тем более сразу въедешь как в С представляются строки и как ими манипулировать.
Rock'n'roll мертв © БГ
Спасибо сказали: