Я действительно новичок в C, но некоторое время пишу на C++. Я пишу клиентскую программу чата. Мне нужно предложить пользователю несколько разных вариантов в начале сеанса после того, как он ввел имя пользователя. Сначала я пытался использовать функцию getchar(), но по той или иной причине любые операторы следующего шаблона не давали ожидаемых результатов:
int x = getchar();
if (x == '2') doSomething();
Если пользователь ввел 2, он никогда не перейдет в область «сделать что-то». Поэтому я попытался вместо этого использовать fgets и strncmp. Но теперь я продолжаю получать ошибки сегментации на strncmp. Вот наиболее важная часть кода с некоторыми закомментированными разделами из моих попыток использовать getchar. По общему признанию, это немного беспорядочно, потому что я просто собирал это вместе в качестве теста. Я думал, что, возможно, выделение дополнительного пространства для строки поможет предотвратить ошибки seg, но, конечно же, этого не произошло.
for( ; ; )
{
printf("\r\n1.List Users \r\n2.Chat \r\n3.Exit \r\n \r\n \r\n");
char *x = malloc(5);
fgets(x, 2, stdin);
if (x[0] != NULL)
{
if (strncmp (x[0],"a",1) == 0)
{
printf("yay");
}
}
/* int x = getchar();
if(x == 'a') // Compare input to 'q' character
break;
fprintf(stdout, "%d\n", x);*/
/*x = c - '0';
if (x == 1)
getUsers(sockfd);
if ( x == 2 )
{
pthread_create(&sndThread, NULL, do_send, (void *) sockfd);
pthread_create(&rcvThread, NULL, do_recv, (void *) sockfd);
pthread_join(sndThread, NULL);
pthread_join(rcvThread, NULL);
}
if ( x == 3 )
{
close(sockfd);
exit(0);
}*/
}
Вы можете увидеть в оставшихся комментариях остатки попыток сделать такие вещи, как приведение char к int с вычитанием. Это исходит из материала, который я нашел в Интернете. Я также слышал в Интернете, что getchar оставляет \n во входном буфере.
Итак, вот весь мой код для клиента, чтобы вы могли поместить это в контекст:
int main(int argc, char **argv)
{
int sockfd, i;
char *myName = malloc(MSGSIZE);
char c;
struct sockaddr_in servaddr;
int status;
pthread_t sndThread;
pthread_t rcvThread;
if(argc != 2)
{
printf("Error: expected IP address argument");
exit(1);
}
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
error("Socket error");
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORTNUM);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <=0)
{
printf("inet_pton error for %s \n", argv[1]);
exit(3);
}
if(connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
{
error("Connect error");
}
printf("Type in a username: \r\n");
while ( fgets(myName[i],MSGSIZE,stdin ) == NULL){}
printf(">%s<\n",myName);
send_userName(myName,sockfd);
for( ; ; )
{
printf("\r\n1.List Users \r\n2.Chat \r\n3.Exit \r\n \r\n \r\n");
char *x = malloc(5);
fgets(x, 2, stdin);
if (x[0] != NULL)
{
if (strncmp (x[0],"a",1) == 0)
{
printf("yay");
}
}
/* int x = getchar();
if(x == 'a') // Compare input to 'q' character
break;
fprintf(stdout, "%d\n", x);*/
/*x = c - '0';
if (x == 1)
getUsers(sockfd);
if ( x == 2 )
{
pthread_create(&sndThread, NULL, do_send, (void *) sockfd);
pthread_create(&rcvThread, NULL, do_recv, (void *) sockfd);
pthread_join(sndThread, NULL);
pthread_join(rcvThread, NULL);
}
if ( x == 3 )
{
close(sockfd);
exit(0);
}*/
}
}