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

时间:2015-05-26 13:39:10

标签: c string strcpy c-strings

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

strcpy()致电之前:

(gdb) print received_message
$6 = "9210070627\000\000\000\000\000\000\000\000\000"

strcpy()致电后:

(gdb) print received_message
$8 = "\000\062\061\060\060\067\060\066\062\067\000\000\000\000\000\000\000\000\000"

\060 ... \067 = 48 ... 65。

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

我已经解决了实际问题,只是放入一个空终结符而不是尝试将字符串设为空,因为我知道字符串的长度,但我仍然对这里发生的事情非常好奇。

编辑:似乎有些人想要了解我为何会这样做的更多背景知识。我这样做是因为我使用zmq,它发送和接收没有null终止符的字符串。我在测试中遇到了一个问题,我正在做以下事情:

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

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

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

让我感到困惑的是,这个memset()调用用前缀为strcpy()的单个数字替换了字符串中最初的数字,我误认为{{1}这样的ASCII字符而不是以\06为前缀的0。

我已经修复了接收消息的问题,因为\060返回没有空终止符的字符串长度,所以要在接收消息的末尾放置一个空字符,我们只需要做

\06

在这种情况下,zmq_recv()是一个20个元素的int received_length = zmq_recv(request_socket, received_message, 20, 0); received_message[received_length] = 0; 数组,我担心接收的消息会比这种情况更长。

在解决问题之后,我仍然对我的received message电话发生了什么感到好奇,尽管我没有正确理解发生了什么。我仍然很好奇为什么这些数字的前缀是char

2 个答案:

答案 0 :(得分:4)

你不应该使用

 strcpy(buffer, "")

flush 缓冲区。它只会将""复制到目的地,并使buffer 区域的其余部分保持不变

这就是为什么你可以看到以前的值保留

详细说明,buffer的值为"9210070627",在strcpy(buffer, "")之后,"9"\0取代,但剩余的值在buffer中持续存在。

检查ASCII表中的值。

也许,你想要的是

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

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

答案 1 :(得分:3)

目前还不清楚打算做什么,但代码完全按照告诉的方式执行。

C“string”是一系列以{null}结尾的char元素。无论在该值之后发生什么,都不是字符串的一部分。

通话前的字符串:

  

“9210070627”(后跟一个空值,以及一系列可能属于缓冲区或调试器工件的空值,我们不知道)。

您的电话:

  

strcpy(buffer, "")(将空字符串复制到缓冲区,并以null值终止)

通话后的字符串:

  

“” - 一个空字符串,后跟终止空值(加上“210070627”和前一个内容中剩余的空值,作为不属于上述字符串一部分的工件)。

因此,您的缓冲区现在包含一个空字符串,如您所指示的那样。它还包含原始数据的保留,但buffer 指向空字符串。 strlen( buffer ) == 0

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