【问题标题】:C socket client sending newline characterC套接字客户端发送换行符
【发布时间】:2014-03-29 02:26:44
【问题描述】:

您好,我是套接字编程的新手,我编写了一个简单的客户端/服务器系统来通过套接字发送数据。我已经让它工作了,这样我就可以向服务器发送一个字符串并接收回复。

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

下面是编写代码:

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 缓冲区[strlen(buffer) - 1] = '\0';只是清除 fgets end 的输出缓冲区的新行并将其替换为 null (强制字符串结束)。虽然有时使用归零缓冲区确实是一个好主意,但这里并不严格需要。但是,是的,使用位图或不是 ascii 文本的东西是正确的。
  • 注意,fgets 需要缓冲区大小,所以如果 buffer 是一个数组,则将其设为 256,或者甚至更好,fgets(buffer, sizeof buffer, stdin)

标签: c sockets newline fgets


【解决方案1】:

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

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

必须在 fgets 和 write 之间。

为了安全一点,最好使用

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

【讨论】:

  • 明智的做法是先检查fgets 不返回NULLbuffer[strlen(buffer)-1] == '\n'。否则,您可能会访问无效内存(如果出现读取错误),或者如果行长超过 254,则覆盖有效字符。
  • 啊,你是完全正确的,我只是懒惰并试图保持简单。
  • @MattMcNabb 好了,它已被编辑。虽然我没有介绍 fgets 返回 NULL 的部分,因为这不是真正的问题(虽然记住很有用)
【解决方案2】:

buffer[strcspn(buffer,'\n')] = 0 也是解决问题的好方法。

你可以在这里https://www.tutorialspoint.com/c_standard_library/c_function_strcspn.htm看到更多关于 strcspn 的详细信息

祝你好运!

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2021-11-09
    • 2015-10-27
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多