Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

gets() проблем

Featured Replies

при тази програма при всяка врътка на цикъла прескача gets() къде е проблема

#include <stdio.h>

int main(void){

int a,b;

char c[100];

for(a=0;a<10;a++){

printf("Enter number: ");

scanf("%d",&b);

printf("Enter name: ");

gets©;

}

return 0;}

при тази програма при всяка врътка на цикъла прескача gets() къде е проблема

Проблемът ти е класически. Смесваш функции за форматиран вход с неформатиран такъв. Резултатът е че след scanf, остава един символ за край на ред във стандартният вход и gets реагира все едно директно си натиснал Enter. За нов scanf това не е проблем, защото той си го очаква.
  • Автор

Проблемът ти е класически. Смесваш функции за форматиран вход с неформатиран такъв. Резултатът е че след scanf, остава един символ за край на ред във стандартният вход и gets реагира все едно директно си натиснал Enter. За нов scanf това не е проблем, защото той си го очаква.

а как да го оправя

а как да го оправя

Като не пишеш подчертано. Подчертаването и удебеляването няма да ускори отговорите на въпросите ти, а е малко дразнещо :tongue2:

А сега сериозно. Ами, мислех че е очевидно - като знаеш причините за един проблем и искаш да го оправиш - премахваш ги. Тоест:

  • ползваш само scanf или само gets, или
  • с "нещо" например още един gets() си flush-ваш входа. В този случай ще работи, защото scanf ще те остави в известно състояние. Ако искаш да е още по-универсално, може и цикъл с проверка.
  • Автор

Като не пишеш подчертано. Подчертаването и удебеляването няма да ускори отговорите на въпросите ти, а е малко дразнещо :tongue2:

А сега сериозно. Ами, мислех че е очевидно - като знаеш причините за един проблем и искаш да го оправиш - премахваш ги. Тоест:

  • ползваш само scanf или само gets, или
  • с "нещо" например още един gets() си flush-ваш входа. В този случай ще работи, защото scanf ще те остави в известно състояние. Ако искаш да е още по-универсално, може и цикъл с проверка.
оки а със fflush(stdin) след scanf() ще стане ли

оки а със fflush(stdin) след scanf() ще стане ли

Мисля, чe fflush на входен поток е с неопределено поведение, т.е. не е описано в стандарта. Може да работи, а може и да не работи. Аз не бих ползвал такова нещо.
  • Автор

Мисля, чe fflush на входен поток е с неопределено поведение, т.е. не е описано в стандарта. Може да работи, а може и да не работи. Аз не бих ползвал такова нещо.

опитах с gets() и преобразувам с atoi() низа в цяло число така работи

#include <stdio.h>

#include <stdlib.h>

int main(void){

int a,b;

char c[255];

for(a=0;a<20;a++){

printf("Enter name: ");

gets©;

printf("Enter number: ");

gets©;

b=atoi©;

}

return 0;}

има ли по лесен начин

Само със scanf? Тогава няма да ти се наложи да ползваш atoi.

  • Автор

Само със scanf? Тогава няма да ти се наложи да ползваш atoi.

оки мерси а вие писали ли сте нещо за socket на C

защото това ми е за една socket програма

Не особено много, но все пак. Какъв точно ти е socket проблема?

  • Автор

Не особено много, но все пак.

Какъв точно ти е socket проблема?

ами става дума за select

защо при първия случай работи а при втория не работи

ами става дума за select

защо при първия случай работи а при втория не работи

1

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <errno.h>

#include <sys/select.h>

int main(int argc,char *argv[]){

int port,sock, check,newsock,a,b,yes;

char buf[255],buf1[255],buf2[255];

struct sockaddr_in server,client1;

socklen_t len=sizeof(client1);;

fd_set read,master;

port=atoi(argv[1]);

memset(&server,0,sizeof(server));

server.sin_family=AF_INET;

server.sin_port=htons(port);

server.sin_addr.s_addr=INADDR_ANY;

sock=socket(AF_INET,SOCK_STREAM,0);

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes));

bind(sock,(struct sockaddr *)&server, sizeof(server));

listen(sock,10);

FD_ZERO(&master);

FD_SET(sock,&master);

FD_SET(0,&master);

for(;Публикувано изображение{

gore:

read=master;

select(FD_SETSIZE,&read,NULL,NULL,NULL);

for(a=0;a<FD_SETSIZE;a++){

if(FD_ISSET(a,&read)&&a!=0){

if(a==sock){

newsock=accept(sock,(struct sockaddr*)&client1,&len);

FD_SET(newsock,&master);

inet_ntop(AF_INET, &(client1.sin_addr), buf1, INET_ADDRSTRLEN);

printf("New connection from socket %d ip address %s port %dn",newsock, buf1, n

}

else{

check=recv(a,buf,sizeof(buf),0);

if(!check){

close(a);

FD_CLR(a,&master);

goto gore;}

buf[check]='0';

printf("%sn",buf);

}

}

else if(FD_ISSET(0,&read)){

gets(buf1);

printf("to socket: ");

gets(buf2);

check=strlen(buf1);

buf[check]=0;

b=atoi(buf2);

if(b==3){

printf("Trqbva da ne se izpra6tat syob6teniq do ekranan");

goto gore;}

send(b,buf1,strlen(buf1),0);

goto gore;

}

}

}

return 0;}

2

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <stdlib.h>

int main(int argc,char *argv[]){

int a,b,sock,newsock,port;

char buf[255];

fd_set read;

struct sockaddr_in server,client;

socklen_t clilen;

memset(&server,0,sizeof(server));

clilen=sizeof(server);

sock=socket(AF_INET,SOCK_STREAM,0);

server.sin_family=AF_INET;

server.sin_addr.s_addr=INADDR_ANY;

server.sin_port=htons(atoi(argv[1]));

bind(sock,(struct sockaddr *)&server,sizeof(server));

listen(sock,10);

while(1){

FD_ZERO(&read);

for(a=sock;a<FD_SETSIZE;a++) FD_SET(a,&read);

select(FD_SETSIZE,&read,NULL,NULL,NULL);

for(a=sock;a<FD_SETSIZE;a++)

if(FD_ISSET(a,&read)){

if(a==sock) newsock=accept(sock,(struct sockaddr*) &server, &clilen);

else{

b=recv(a,buf,sizeof(buf),0);

buf=0;

printf("%sn",buf);

}}}

return 0;}

  • Автор

ами става дума за select

защо при първия случай работи а при втория не работи

1

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <errno.h>

#include <sys/select.h>

int main(int argc,char *argv[]){

int port,sock, check,newsock,a,b,yes;

char buf[255],buf1[255],buf2[255];

struct sockaddr_in server,client1;

socklen_t len=sizeof(client1);;

fd_set read,master;

port=atoi(argv[1]);

memset(&server,0,sizeof(server));

server.sin_family=AF_INET;

server.sin_port=htons(port);

server.sin_addr.s_addr=INADDR_ANY;

sock=socket(AF_INET,SOCK_STREAM,0);

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes));

bind(sock,(struct sockaddr *)&server, sizeof(server));

listen(sock,10);

FD_ZERO(&master);

FD_SET(sock,&master);

FD_SET(0,&master);

for(;Публикувано изображение{

gore:

read=master;

select(FD_SETSIZE,&read,NULL,NULL,NULL);

for(a=0;a<FD_SETSIZE;a++){

if(FD_ISSET(a,&read)&&a!=0){

if(a==sock){

newsock=accept(sock,(struct sockaddr*)&client1,&len);

FD_SET(newsock,&master);

inet_ntop(AF_INET, &(client1.sin_addr), buf1, INET_ADDRSTRLEN);

printf("New connection from socket %d ip address %s port %dn",newsock, buf1, n

}

else{

check=recv(a,buf,sizeof(buf),0);

if(!check){

close(a);

FD_CLR(a,&master);

goto gore;}

buf[check]='0';

printf("%sn",buf);

}

}

else if(FD_ISSET(0,&read)){

gets(buf1);

printf("to socket: ");

gets(buf2);

check=strlen(buf1);

buf[check]=0;

b=atoi(buf2);

if(b==3){

printf("Trqbva da ne se izpra6tat syob6teniq do ekranan");

goto gore;}

send(b,buf1,strlen(buf1),0);

goto gore;

}

}

}

return 0;}

2

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <stdlib.h>

int main(int argc,char *argv[]){

int a,b,sock,newsock,port;

char buf[255];

fd_set read;

struct sockaddr_in server,client;

socklen_t clilen;

memset(&server,0,sizeof(server));

clilen=sizeof(server);

sock=socket(AF_INET,SOCK_STREAM,0);

server.sin_family=AF_INET;

server.sin_addr.s_addr=INADDR_ANY;

server.sin_port=htons(atoi(argv[1]));

bind(sock,(struct sockaddr *)&server,sizeof(server));

listen(sock,10);

while(1){

FD_ZERO(&read);

for(a=sock;a<FD_SETSIZE;a++) FD_SET(a,&read);

select(FD_SETSIZE,&read,NULL,NULL,NULL);

for(a=sock;a<FD_SETSIZE;a++)

if(FD_ISSET(a,&read)){

if(a==sock) newsock=accept(sock,(struct sockaddr*) &server, &clilen);

else{

b=recv(a,buf,sizeof(buf),0);

buf=0;

printf("%sn",buf);

}}}

мисля че разбрах от къде е грешката във втория пример

вклучих errno.h

и проверих резултата от select

връща -1

и настройва errno на bad file descriptor

значи след for(a=sock;a<FD_SETSIZE;a++) FD_SET(a,&read);

във втория пример

аз се опитвам да задам несъществуващи файлови дескриптори

и за това ми връща -1 selecta и не функционира

добре че е errno да разбера причината Публикувано изображение

Публикувано изображение

return 0;}

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.