strcpy 将随机数添加到空字符串

strcpy adding random numbers to empty string

我正在尝试使用 strcpy(buffer, "") 清除 char 缓冲区。 strcpy() 似乎是在字符串中放入随机数。在 gdb 中,我看到缓冲区 (received_message):

strcpy() 调用之前:

(gdb) print received_message
 = "9210070627[=10=]0[=10=]0[=10=]0[=10=]0[=10=]0[=10=]0[=10=]0[=10=]0[=10=]0"

strcpy()调用后:

(gdb) print received_message
 = "[=11=]0210070627[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0"

其中 0 ... 7 = 48 ... 65.

我在代码中的 strcpy() 调用只是 strcpy(received_message, "");,所以我不确定发生了什么。

因为我知道字符串的长度,所以我只是通过添加一个空终止符而不是尝试使字符串为空来解决了实际问题,但我仍然很好奇这里发生了什么。

编辑: 似乎有些人想了解我为什么这样做的更多背景知识。我这样做是因为我正在使用 zmq,它发送和接收没有空终止符的字符串。我在执行以下操作的测试中 运行 遇到了问题:

Send 1234
Receive 1234
Send 123
Receive 1234
Send 12345
Receive 12345
Send 1234
Receive 12345

似乎正在发生的事情是我重新使用我的缓冲区来接收消息 (received_message),如果前一个字符串比接收到的字符串长,它会保留值。

为了解决这个问题,我想 "flush" 缓冲区,这意味着我想将它全部设置为空字符。通过阅读其他一些答案,似乎 strcpy(received_message, "")recived_message[0] = 0 都可以解决问题。但是,这些都不起作用,因为它们只将第一个字符设置为空。我知道 "flushing" 缓冲区的 memset() 方法,但读到它比 strcpy(received_message, "") 之类的方法慢一点,所以没有使用它。我想出的解决方案(并在下面显示)避免使用 memset() 设置整个数组,所以我对它更满意,尽管它可能根本没有任何区别。

让我感到困惑的是,这个 strcpy() 调用用前缀为 </code> 的单个数字替换了字符串中最初的数字,我误认为是 ASCII 字符,例如 <code>0 而不是前缀为 </code>.</p> 的 0 <p>我已经解决了接收消息的问题,因为<code>zmq_recv() returns字符串长度没有空终止符,所以要在接收到的消息末尾放置一个空字符,我们只需要去做

int received_length = zmq_recv(request_socket, received_message, 20, 0);
received_message[received_length] = 0;

在这种情况下,received messagechar 的 20 元素数组,我担心收到的消息比这种情况下的消息更长。

解决问题后,我仍然很好奇我的 strcpy() 调用发生了什么,虽然我没有正确理解发生了什么。我仍然很好奇为什么数字的前缀是

你不应该使用

 strcpy(buffer, "")

刷新一个缓冲区。它只将 "" 复制到目的地,而 buffer 的其余区域保持不变 .

这就是为什么,您可以看到以前的值被 保留

详细说明,正如我们所见,buffer 的值为 "9210070627",在 strcpy(buffer, "") 之后,"9" 被 [=19 取代=],但剩余的值保留在 buffer 中。

检查 ASCII table 的值。

也许,你想要的是

memset(buffer, 0, sizeof(buffer)); //buffer is char[]

memset(buffer, 0, strlen(buffer)); //buffer is char*

不清楚您打算做什么,但代码完全按照您告诉它要做的。

A C "string" 是一系列以空值结尾的 char 元素。空值之后的任何内容都不是字符串的一部分。

调用前的字符串:

"9210070627" (followed by a null value, and a series of null values that might be part of the buffer or an artifact of the debugger, we don't know).

您的来电:

strcpy(buffer, "") (copy empty string into buffer, and terminate with null value)

调用后的字符串:

"" -- an empty string, followed by the terminating null value (plus the "210070627" and null values remaining from the previous content as artifacts which aren't part of the string as mentioned above).

因此,按照您的指示,您的缓冲区现在包含一个空字符串。它还包含原始数据的 remains,但是 buffer does 指向一个空字符串。 strlen( buffer ) == 0.

如果您打算擦除缓冲区的内容,即将整个缓冲区归零,您应该尝试memset()