本声明
char str[] = "geeksforgeeks";
声明一个字符数组,其中包含一个字符串,该字符串是包含终止零符号的字符序列'\0'
.
您可以用以下等效方式想象声明
char str[] =
{
'g', 'e', 'e', 'k', 's', 'f', 'o', 'r', 'g', 'e', 'e', 'k', 's', '\0'
};
这个函数的调用memset
memset(str, 't', sizeof(str));
覆盖数组的所有字符,包括终止零。
所以接下来的声明
cout << str << endl;
导致未定义的行为,因为它输出字符直到遇到终止零。
你可以写
#include <iostream>
#include <cstring>
int main()
{
char str[] = "geeksforgeeks";
std::memset( str, 't', sizeof( str ) - 1 );
std::cout << str << '\n';
}
或者通过以下方式
#include <iostream>
#include <cstring>
int main()
{
char str[] = "geeksforgeeks";
std::memset( str, 't', std::strlen( str ) );
std::cout << str << '\n';
}
即保持数组中的终止零不变。
如果您想覆盖数组的所有字符(包括终止零),那么您应该替换此语句
std::cout << str << '\n';
对于这个声明
std::cout.write( str, sizeof( str ) ) << '\n';
正如下面的程序所示,因为数组现在不包含字符串。
#include <iostream>
#include <cstring>
int main()
{
char str[] = "geeksforgeeks";
std::memset( str, 't', sizeof( str ) );
std::cout.write( str, sizeof( str ) ) << '\n';
}
至于这个电话
memset(str, "t", sizeof(str));
然后是第二个参数的类型(即类型const char *
) 与具有以下类型的第二个函数参数的类型不对应int
。查看函数的声明
void * memset ( void * ptr, int value, size_t num );
因此编译器会发出错误消息。
除了字符数组(即使在 C++ 中也经常使用)之外,您还可以使用标准类std::string
(or std::basic_string
) 模拟字符串。
在这种情况下,无需使用标准 C 函数 memset 来用单个字符填充字符串。最简单的方法如下
#include <iostream>
#include <string>
int main()
{
std::string s( "geeksforgeeks" );
s.assign( s.length(), 't' );
std::cout << s << '\n';
}
另一种方法是使用标准算法std::fill
or std::fill_n
在标头中声明<algorithm>
。例如
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
std::string s( "geeksforgeeks" );
std::fill( std::begin( s ), std::end( s ), 't' );
std::cout << s << '\n';
}
or
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
std::string s( "geeksforgeeks" );
std::fill_n( std::begin( s ), s.length(), 't' );
std::cout << s << '\n';
}
你甚至可以使用该方法replace
班级的std::string
以下方式之一
#include <iostream>
#include <string>
int main()
{
std::string s( "geeksforgeeks" );
s.replace( 0, s.length(), s.length(), 't' );
std::cout << s << '\n';
}
Or
#include <iostream>
#include <string>
int main()
{
std::string s( "geeksforgeeks" );
s.replace( std::begin( s ), std::end( s ), s.length(), 't' );
std::cout << s << '\n';
}