gpt4 book ai didi

c - Strncmp:异常段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:43 27 4
gpt4 key购买 nike

我真的是 C 的新手,但我已经编写 C++ 有一段时间了。我正在写一个客户端服务器聊天程序。在用户输入用户名后,我需要在 session 开始时提示用户几个不同的选项。起初我试图使用 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。这来 self 在互联网上找到的东西。我还在网上听说 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);
}*/
}

最佳答案

x[0] 是一个字符,但是 x 是一个 char*strncmp 应该只将 x 作为参数,而不是 x[0]。也就是说,你不想

strncmp(x[0],"a",1)

而是

strncmp(x,"a",1)

或者,如果您真的想强调您是从 x 的第一个字符开始的,您可以执行以下任一操作:

strncmp(x+0,"a",1)

strncmp(&x[0],"a",1)

关于c - Strncmp:异常段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26282176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com