C套接字客户端发送换行符

C socket client sending newline character

嗨,我是套接字编程的新手,并且我编写了一个简单的客户端/服务器系统来通过套接字发送数据。 我已经使其正常工作,以便可以将字符串发送到服务器并收到答复。

现在,我正在尝试让服务器识别从客户端发送的命令,但是我从客户端发送的所有内容最后都带有换行符。 我知道我可以从服务器端处理此问题,但是有没有办法从客户端删除换行符?

这是编写代码的代码:

1
2
3
4
printf("Please enter the message:");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));

  • 在写入缓冲区之前将其内存设置为0。
  • @CantChooseUsernames为什么他会出于兴趣而这样做?
  • 它将每个字节设置为0,因此OP不必执行buffer[strlen(buffer) - 1] = \0;,我想后者比使用memset更好。 如果OP处理位图或大型缓冲区和结构,则应使用memset。
  • @CantChooseUsernames buffer [strlen(buffer)-1] = 0; 只是为了清除fgets结束于其输出缓冲区的新行,并用null替换它(以强制字符串结束)。 尽管有时使用调零的缓冲区确实是个好主意,但在此严格要求。 但是,是的,使用位图或非ascii文本的内容是正确的。
  • 请注意,fgets需要缓冲区大小,因此,如果buffer是数组,则将其设置为256,甚至更好的是fgets(buffer, sizeof buffer, stdin)


是的,确实,您的问题不是套接字正在添加新行(套接字从不处理或更改数据),而是您对fgets的调用只是捕获您键入的换行。 您可以使用此方便的一个衬纸将其删除:

1
buffer[strlen(buffer) - 1] = '\0';

必须在fget和write之间。

为了安全起见,最好使用

1
2
3
if('
'
== buffer[strlen(buffer) - 1])
    buffer[strlen(buffer) - 1] = '\0';

  • 检查fgets不返回NULL,并且首先返回buffer[strlen(buffer)-1] ==
    是明智的。 否则,您可能会访问无效的内存(如果存在读取错误),或者如果该行长于254,则覆盖一个有效字符。
  • 啊,您是完全正确的,我只是在偷懒并尝试保持简单。
  • @MattMcNabb我们走了,它已经被编辑。 尽管我没有讨论fgets返回NULL的部分,因为这并不是真正的问题(尽管记住这一点很有用)


解决您的问题的一个好方法是buffer[strcspn(buffer,'
')] = 0

您可以在https://www.tutorialspoint.com/c_standard_library/c_function_strcspn.htm上查看有关C语言中strcspn的更多详细信息

祝好运!