※ 引述《blackcity (超黑城市)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Win10
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: GCC Eclipse
: 问题(Question):
: 1. string AddPadding(int PadLen, string Str)
: {
: char buff[100];
: snprintf(buff, 100, " %*s", PadLen, Str.c_str());
: return buff;
: }
不晓得你有没有思考过下面几种呼叫方式的差别, 以及它们的正确
性:
AddPadding( -1, "hello world");
AddPadding(100, "hello world");
const std::string s("hello world");
AddPadding(100, s);
: 2. string AddPadding(int PadLen, string Str, char* buff)
: {
: snprintf(buff, 100, " %*s", PadLen, Str.c_str());
: return buff;
: }
char c;
AddPadding(100, "hello world", &c);
AddPadding(100, "hello world", nullptr);
: 3. string AddPadding(int PadLen, string Str, char* buff)
: {
: int PadCount = PadLen - Str.length() + 1;
: for (int Index = 0; Index < PadCount; Index++)
: {
: buff[Index] = ' ';
: }
: strcpy(buff + PadCount, Str.c_str());
: return buff;
: }
: Note: (2)(3)外部宣告char buff[100];
: 想请问一下,第一种写法是可行的吗?
: 还是会有机会造成buff的空间释放后资料错误?
: 第二种和第三种写法应该是结果相同且能保证回传的资料没问题吧...
: 谢谢
如果只是要将原字串转换为长度至少为 N 的字串, 前方补特定字符
, 其实用 std::string 本身的成员函式就可以了. 不需要依赖额外
的内存空间, 且把大小写死进而产生呼叫的潜规则:
string addPadding(
string::size_type n,
const string& str,
string::value_type c = ' '
) {
string result;
// allocate memory only once
result.reserve(std::max(str.length(), n));
// append padding chars
result.append(str.length() < n ? n - str.length() : 0, c);
// append str itself
return result.append(str);
}
这边用 const std::string& 来接引数是为了避免不必要的物件拷
贝; 然而如果要进一步避免隐式转换, 还需要提供参数为
const char* 的多载版本.
example: https://bit.ly/2TFAik5