私は 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);
}*/
}
}