我正在尝试使用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
。
答案 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()
。