Saya benar-benar baru mengenal C, tetapi saya sudah lama menulis C++. Saya sedang menulis program obrolan server klien. Saya perlu memberi pengguna beberapa opsi berbeda di awal sesi, setelah mereka memasukkan nama pengguna. Pada awalnya saya mencoba menggunakan fungsi getchar(), tetapi karena satu dan lain hal, pernyataan apa pun dari pola berikut tidak akan memberikan hasil yang diharapkan:
int x = getchar();
if (x == '2') doSomething();
Jika pengguna memasukkan 2, ia tidak akan pernah masuk ke area "doSomething". Jadi saya mencoba menggunakan fgets dan strncmp sebagai gantinya. Tapi sekarang, saya terus mendapatkan kesalahan segmentasi di strncmp. Ini adalah bagian kode yang paling relevan, dengan beberapa bagian yang dikomentari dari upaya saya menggunakan getchar. Memang ini agak berantakan, karena saya hanya menjadikannya sebagai ujian. Saya pikir mungkin mengalokasikan ruang ekstra ke string akan membantu mencegah kesalahan seg tapi tentu saja tidak.
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);
}*/
}
Anda dapat melihat di komentar sisa sisa upaya untuk melakukan hal-hal seperti memasukkan karakter ke int dengan pengurangan. Ini berasal dari hal-hal yang saya temukan di internet. Saya juga mendengar di internet bahwa getchar meninggalkan \n di buffer input.
Jadi, inilah seluruh kode saya untuk klien sehingga Anda dapat memasukkannya ke dalam konteks:
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);
}*/
}
}