清除C中的char数组

时间:2017-05-23 07:34:16

标签: c arrays sockets tcp

我已经声明了char data[101];,然后从socket读取消息(服务器 - 客户端通信)。在屏幕上显示消息后,我想清除/清空该char数组。我尝试了memset(data, 0, sizeof(data))bzero(data, sizeof(data));我认为它仍然没有明确。在收到第一条消息后的输出中,我也得到一些奇怪的字符: |V ,然后它们也会显示消息。现在我不知道那是来自客户端还是服务器端。我试图在两者上清除它,但结果没有任何不同。

这是我发送消息的方式:

char data[101];
read(0, data, 101);
dprintf(socket_fd, data);
bzero(data, sizeof(data));

2 个答案:

答案 0 :(得分:1)

您展示的代码非常有问题:

char data[101];
read(0, data, 101);
dprintf(socket_fd, data);

它有三个主要问题:

  1. 您不会检查错误,这意味着如果read调用失败,您将发送未初始化的数据。

  2. 您不会将输入作为字符串终止,这意味着您在发送时可能会超出范围。

  3. 如果输入包含printf格式化序列,那么dprintf将尝试读取不存在的参数,并且您将拥有未定义的行为(和一个非常大的安全漏洞。)

  4. 以下代码应修复以上所有内容:

    char data[101];  // Place for a 100-character string, plus terminator
    
    ssize_t bytes_read = read(STDIN_FILENO, data, sizeof(data) - 1);  // -1 since we need space for terminator
    
    // Make sure the read call went okay
    if (bytes_read > 0)
    {
        // There was no error or end-of-file
        data[bytes_read] = '\0';  // Terminate as a string
    
        dprintf(socket_fd, "%s", data);  // Send the data
    }
    

    在接收端,您当然需要在接收数据时添加错误检查,尝试接收比数据缓冲区大小更少的一个字节,并在打印之前终止数据缓冲区。

答案 1 :(得分:1)

这是另一种替代解决方案

//Declare and initialize to NUL characters.
char data[101] ="";  

//fgets() will take care of out of boundary issue.
 if (fgets(stdin, data, sizeof(data))
    dprintf(socket_fd, "%s", data);  // Send the data