我真的是 C 的新手,但我写 C++ 已经有一段时间了。我正在编写一个客户端服务器聊天程序。在用户输入用户名后,我需要在会话开始时向用户提示几个不同的选项。起初我试图使用 getchar() 函数,但由于某种原因,以下模式的任何语句都不会产生预期的结果:
int x = getchar();
if (x == '2') doSomething();
如果用户输入 2,它将永远不会进入“doSomething”区域。所以我尝试改用 fgets 和 strncmp 。但是现在,我不断在 strncmp 上遇到分段错误。这是代码中最相关的部分,在我尝试使用 getchar 时有一些注释掉的部分。诚然,这有点混乱,因为我只是把它放在一起作为测试。我想也许为字符串分配额外的空间将有助于防止段错误,但当然它没有。
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);
}*/
}
}