- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我真的是 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/
据我了解,strcmp()(无“n”)在任一参数中看到空字符后,立即停止处理并返回结果。 因此,如果已知 100% 确定其中一个参数以 null 结尾(例如,它是一个字符串文字),则使用 strncm
我找不到我的 parse() 函数中的问题。简短介绍:我从我的终端程序发送“boot\r\n”,调用了 parse() 函数,strncmp(buffer, "boot",4) 永远不会进入 if 分
我尝试创建我自己的学校项目所需的 strncmp 函数,我运行使用相同 srcmp 函数的代码,但提供了我想要比较的 ASCII 代码的限制大小: 编码: #include int strn
我在使用 strncmp 时遇到问题。据我了解,理论上,如果两个字符串比较的字符相等,strncmp 应该返回 0;但是,当我进行比较时,代码行为不当并产生误报(不等于字符,仍然会产生 if 子句)。
该程序应该允许用户输入一些名称(直到用户希望继续),然后按升序显示这些名称。我使用了 strncmp 函数来比较 char 数组。但是,当运行此命令时,只有已排序名称列表的第一个和最后一个名称作为输出
这段代码在“check_connected”过程中有一个奇怪的行为。使用strncmp函数之前将参数转换为char[30],如果不转换,结果是“堆栈溢出”。问题出现在两个字符串的比较结果中,“Le s
我有一个静态检查器,它提示在 if 条件下使用 strncmp,说 Logical operation performed on expression with possible side effec
我真的是 C 的新手,但我已经编写 C++ 有一段时间了。我正在写一个客户端服务器聊天程序。在用户输入用户名后,我需要在 session 开始时提示用户几个不同的选项。起初我试图使用 getchar(
我不知道如何在 C 中使用字符串: 这是我的服务器的一部分:中断永远不会被调用,即使我通过 telnet 提供了字符“/”。 理想情况下,这将通过将字符串 ch 一遍又一遍地添加到它来缓冲名为 get
在运行下面的代码时,我看到出现了 "x,y" 模式。此模式正在此处打印:printf("%s", start);。但是 if (strncmp(cp, VAL, strlen(VAL) == 0 ))
我一直在解决 strncmp 和 getline 的问题...所以我做了一个小测试应用程序。 strncmp 给出误报,我不知道我做错了什么。 这是程序 #include FILE *fp=NULL
我目前有一个正在运行的链表结构,我需要找到一种方法让用户在该结构中搜索某个字段。我已经完成了,但问题是它必须是准确的。例如,如果用户输入“maggie”它会返回结果,但是如果用户输入“mag”它不会像
这是快速背景:我有一个客户端程序和一个服务器程序,它们通过 Unix 套接字相互通信。在服务器端解析收到的消息时,我试图使用 strncmp 来确定要采取的操作。 我遇到的问题是弄清楚 strncmp
Fortify 表示这是越界读取: if (strncmp("test string", "less than 32 char", 32) == 0) { ... } 表示函数从小于32个字符的边界外
如果输入是 end,strncmp("end",input,3) == 0 不应该返回 0 吗?但它返回一个 > 0 的数字。 #include int main(void) { char *s
我正在尝试编写一个比较数字前两位数字的函数,并且由于 itoa 不可用,因此我使用之前通过谷歌搜索找到的 sprintf 首先将数字转换为字符串,然后比较每个数字。由于某种奇怪的原因,当我运行这个程序
在这个关于带有信号量的共享内存(生产者/消费者)的程序中(在 DEBIAN 上),当我使用带有字符串“end”的 strncmp 函数时,为了打开 0 标志(运行)来终止 while 循环, strn
我是 C 代码新手。对于此特定代码,如果用户输入名称 john, “john is Cool” 将被打印。我认为我没有正确使用 strncmp() 。有人可以帮忙吗? #include #inclu
在我输入10个名字后,我必须打印所有以A开头的名字。它不打印任何内容 #include #include #include void main(void) { int i; char
为了在我的代码中进行文件排序,我使用了 strncmp 来比较每个字符串的第一个元素。 在这里包括我的代码: 代码 1: for (i = 1; i < file_cnt; ) { if ((st
我是一名优秀的程序员,十分优秀!