我被困在一个简单的代码片段中:
#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
中使用这个数组,因此我不想使用空终止符。有没有更好的选择?
strlen
和operator<<(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 都依赖于空终止符来指示字符串的结尾