使用 memset 填充数组会显示垃圾



我被困在一个简单的代码片段中:

#include <iostream>
#include <stdio.h>
#include<cstring>
#include <algorithm>
int main()
{
        int l;
        std::cin >> l;
        char leading[l];
        //std::fill_n(leading, l, '0');
        memset(leading, '0', sizeof(char)*l);
        std::cout << "->" << leading << "<- strlen=" << strlen(leading) << std::endl;
}

这是多次运行的结果(与std::fill_n相同的问题(:

~/test$ g++ ptr.cpp 
~/test$ ./a.out 
3
->000*�<- strlen=6
~/test$ ./a.out 
7
->0000000<- strlen=7
~/test$ ./a.out 
6
->000000<- strlen=6
~/test$ ./a.out 
5
->00000<- strlen=6
~/test$ ./a.out 
2
->00@��<- strlen=6

我必须找另一份工作吗?

更新:由于我稍后将在sprintf中使用这个数组,因此我不想使用空终止符。有没有更好的选择?

strlenoperator<<(basic_ostream&, char*)都具有指针参数指向以空结尾的字符串为前提条件。您的数组不是以空结尾的,因此您违反了这些前提条件。因此,程序的行为是未定义的。


更新:我不习惯使用空终止符。有没有更好的选择?

不需要strlen的替代品,因为您已经知道长度:l .

要流式传输非以 null 结尾的字符数组,可以使用迭代器:

std::ostream_iterator<char> it(std::cout);
std::copy(leading, std::end(leading), it);

附言。

std::cin >> l;
char leading[l];

这在C++是不成熟的。数组的大小必须是编译时常量。

'0'

您可能想要的''不同。(不允许C++支持的编码系统将字符文本'0'设置为值 0。

在此内存块上使用strlen的行为将未定义。

如果要填充字符 0,请记住在内存块中添加 NUL 终止符,以便 C 类型的字符串函数(以及与此相关的<<(可用。

因为 strlen 和 cout 都依赖于空终止符来指示字符串的结尾

最新更新