gpt4 book ai didi

c - 在使用套接字进行进程间通信期间,strcmp 的行为似乎很奇怪

转载 作者:行者123 更新时间:2023-11-30 15:01:06 26 4
gpt4 key购买 nike

我编写了一个程序,在其中扫描用户的字符串和关键字,并返回该关键字在字符串中出现的次数。在将输入字符串拆分为空格后,我使用了 strcmp 函数,效果很好。

现在,我尝试使用带有套接字的 IPC 来完成相同的工作,其中客户端输入字符串和关键字,服务器执行计数工作。但在这种情况下,对于相同的输入,我没有得到相同的结果。我查看了 strcmp 的返回值,发现即使输入字符串对我来说相同,它也会返回非零值。

可能是什么原因以及如何解决?

这是服务器的代码。引用:http://www.linuxhowtos.org/C_C++/socket.htm

/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{
//
char * input;
char * str;
char * word;
int i, wordLen, strLen;
char terminator = ';';
char * pch;
char * new;
int temp, count = 0;
//
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[36];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,36);
n = read(newsockfd,buffer,35);
if (n < 0) error("ERROR reading from socket");
//
input = (char *) malloc(36);
strcpy(input, buffer);
word = strchr(input, terminator);
temp = (strlen(input) - strlen(word));
str = (char *) malloc(temp);
//strlcpy(str, input, temp);
*str = '\0';
strncat(str, input, temp);
word++;
wordLen = strlen(word);
new = (char *) malloc(temp);
//strlcpy(str, input, temp);

strcpy(new, str);
strLen = strlen(str);
// if (word != NULL && str != NULL) printf("%s%d\n%s%d\n", word, wordLen, new, strLen);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
if(strcmp(pch, word) == 0) count++;
else printf("%s%s%d\n", pch, word, strcmp(pch, word));
pch = strtok (NULL, " ,.-");
printf("(%s)\n",word );
}

//
printf("Here is the output: %d\n",count);
//n = write(newsockfd,"Result: %d\n",count, 18);
if (n < 0) error("ERROR writing to socket");
free(str);
free(input);
free(new);
close(newsockfd);
close(sockfd);

return 0;
}

最佳答案

这里唯一奇怪的是,您假设每个 read() 都会产生一个以 null 结尾的缓冲区。它返回读取计数。使用它。

关于c - 在使用套接字进行进程间通信期间,strcmp 的行为似乎很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41658140/

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