что делать? (не могу понять...)
Модератор: Модераторы разделов
-
ilya--
что делать?
После вырезания текста с помощью memcpy(char *string2, char *string1,1) в конце строки string2 появляются непонятные символы... string1 получается с помощью read(), которая читает данные из сокета. Откуда взялись эти символы??? :new_huh:
-
Jan2ary
- Бывший модератор
- Сообщения: 630
- Статус: Тщедушный очкарик
Re: что делать?
А string2 как объявлен и как использовался до вызова memcpy? Вполне возможно, что это просто мусор, который в памяти завалялся...
Если точно знаешь что там должен быть один символ, можно
*(string2 + 1) = '\0'
Давно на С не писал, камнями не бить. :new_unsure:
Если точно знаешь что там должен быть один символ, можно
*(string2 + 1) = '\0'
Давно на С не писал, камнями не бить. :new_unsure:
Не шалю, никого не трогаю, починяю примус...
-
Shura
- Сообщения: 1537
- Статус: Оказывается и без KDE есть жизнь
- ОС: FreeBSD 8.0-RC2
Re: что делать?
дело в том, что любая строка в С должна завершаться нулем. Если строка не завершается нулем, то программа просто не знает где у строки конец. В твоем случае в string2 после полезной информации идет мусор (ты ведь память забыл обнулить!) вот его ты и видишь.
После копирования в твоем случае надо поставить string[1]=0;
PS Скажу по секрету, у тебя не вырезание, а копирование ;-)
После копирования в твоем случае надо поставить string[1]=0;
PS Скажу по секрету, у тебя не вырезание, а копирование ;-)
Rock'n'roll мертв © БГ
-
ilya--
Re: что делать?
Вот текст проги:
#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;
}
#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: что делать?
ну и нафига нам твоя программа?
тебе же сказали - закрой строку нулем и будет тебе счастье. почему ты еще этого не сделал?
я тоже хочу такую траву!!!!
нафига копировать и выводить строку посимвольно?
да еще и оставляя ее при этом строкой?
про вызов strlen на каждой итерации я уже молчу....
почемуб тебе не сделать так
а?
тебе же сказали - закрой строку нулем и будет тебе счастье. почему ты еще этого не сделал?
Код: Выделить всё
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: что делать?
кстати, не факт, что strlen будет вызываться каждый цикл. Компилятор может соптимизировать. Но, конечно, "на бога надейся, да сам не плошай" ;-)
Shura добавил в 25.01.2005 16:20
Для ilya--:
Все-таки купи книжку по С/С++. Больше половины вопросов точно отпадет. Тем более сразу въедешь как в С представляются строки и как ими манипулировать.
Shura добавил в 25.01.2005 16:20
Для ilya--:
Все-таки купи книжку по С/С++. Больше половины вопросов точно отпадет. Тем более сразу въедешь как в С представляются строки и как ими манипулировать.
Rock'n'roll мертв © БГ