ฉันยังใหม่กับ C มาก แต่ฉันเขียน C++ มาระยะหนึ่งแล้ว ฉันกำลังเขียนโปรแกรมแชทไคลเอนต์เซิฟเวอร์ ฉันต้องแจ้งให้ผู้ใช้ทราบด้วยตัวเลือกต่างๆ สองสามตัวเลือกเมื่อเริ่มต้นเซสชัน หลังจากที่ผู้ใช้ป้อนชื่อผู้ใช้แล้ว ตอนแรกฉันพยายามใช้ฟังก์ชัน getchar() แต่ด้วยเหตุผลใดก็ตาม ข้อความใด ๆ ในรูปแบบต่อไปนี้จะไม่ให้ผลลัพธ์ที่คาดหวัง:
int x = getchar();
if (x == '2') doSomething();
หากผู้ใช้ป้อน 2 ผู้ใช้จะไม่ไปที่พื้นที่ "doSomething" ดังนั้นฉันจึงลองใช้ fgets และ strncp แทน แต่ตอนนี้ ฉันยังคงได้รับข้อผิดพลาดในการแบ่งส่วนใน 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);
}*/
}
คุณสามารถเห็นในความคิดเห็นที่เหลือถึงความพยายามที่เหลือในการทำสิ่งต่างๆ เช่น การหล่อถ่านเพื่อ 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);
}*/
}
}