Padding stl strings in C++

C++StringPaddingStdstring

C++ Problem Overview


I'm using std::string and need to left pad them to a given width. What is the recommended way to do this in C++?

Sample input:

123

pad to 10 characters.

Sample output:

       123

(7 spaces in front of 123)

C++ Solutions


Solution 1 - C++

std::setw (setwidth) manipulator

std::cout << std::setw (10) << 77 << std::endl;

or

std::cout << std::setw (10) << "hi!" << std::endl;

outputs padded 77 and "hi!".

if you need result as string use instance of std::stringstream instead std::cout object.

ps: responsible header file <iomanip>

Solution 2 - C++

void padTo(std::string &str, const size_t num, const char paddingChar = ' ')
{
	if(num > str.size())
		str.insert(0, num - str.size(), paddingChar);
}

int main(int argc, char **argv)
{
	std::string str = "abcd";
	padTo(str, 10);
	return 0;
}

Solution 3 - C++

You can use it like this:

std::string s = "123";
s.insert(s.begin(), paddedLength - s.size(), ' ');

Solution 4 - C++

The easiest way I can think of would be with a stringstream:

string foo = "foo";
stringstream ss;
ss << setw(10) << foo;
foo = ss.str();

foo should now be padded.

Solution 5 - C++

std::string pad_right(std::string const& str, size_t s)
{
    if ( str.size() < s )
        return str + std::string(s-str.size(), ' ');
    else
        return str;
}

std::string pad_left(std::string const& str, size_t s)
{
    if ( str.size() < s )
        return std::string(s-str.size(), ' ') + str;
    else
        return str;
}

Solution 6 - C++

you can create a string containing N spaces by calling

string(N, ' ');

So you could do like this:

string to_be_padded = ...;
if (to_be_padded.size() < 10) {
  string padded(10 - to_be_padded.size(), ' ');
  padded += to_be_padded;
  return padded;
} else { return to_be_padded; }

Solution 7 - C++

There's a nice and simple way :)

const int required_pad = 10;

std::string myString = "123";
size_t length = myString.length();

if (length < required_pad)
  myString.insert(0, required_pad - length, ' ');

Solution 8 - C++

How about:

string s = "          "; // 10 spaces
string n = "123";
n.length() <= 10 ? s.replace(10 - n.length(), n.length(), s) : s = n;

Solution 9 - C++

Minimal working code:

#include <iostream>
#include <iomanip>

int main()
{
    for(int i = 0; i < 300; i += 11)
    {
        std::cout << std::setfill ( ' ' ) << std::setw (2) << (i % 100) << std::endl;
    }
    return 0;
}

/*
Note:
- for std::setfill ( ' ' ):
  - item in '' is what will be used for filling
- std::cout may be replaced with a std::stringstream if you need it
- modulus is used to cut the integer to an appropriate length, for strings use substring
- std::setw is used to define the length of the needed string
*/

Solution 10 - C++

Test this code on https://repl.it/@JomaCorpFX/Padding#main.cpp

We have 2 types of Padding

  • Normal padding

It takes every char of string a individual element

std::string str = u8"Hello"; //5 elements
std::string str2 = u8"Hello 🐢"; //10 elements // 🐢 has 4 chars.
std::string str3 = u8"🐢"; //4 elements // 🐢 has 4 chars.
  • UTF8 padding

It takes length as UTF8 units, an UTF8 unit can be 1-4 chars

std::string str = u8"Hello"; //5 UTF8 units.
std::string str2 = u8"Hello 🐢"; //7 UTF8 units // 🐢 is an individual element.
std::string str3 = u8"🐢"; //1 UTF8 units

The functions

class Strings
{

	static size_t LengthUTF8(const String& data);

	static String SubstringUTF8(const String& data, size_t startIndex, size_t length);

	static String PadRight(const String& data, const size_t& totalWidth, const char& padding);

	static String PadLeft(const String& data, const size_t& totalWidth, const char& padding);

	static String PadRight(const String& data, const size_t& totalWidth, const String& padding);

	static String PadLeft(const String& data, const size_t& totalWidth, const String& padding);

	static String PadRightUTF8(const String& data, const size_t& totalWidth, const char& padding);

	static String PadLeftUTF8(const String& data, const size_t& totalWidth, const char& padding);

	static String PadRightUTF8(const String& data, const size_t& totalWidth, const String& padding);

	static String PadLeftUTF8(const String& data, const size_t& totalWidth, const String& padding);
};

Functions ending in UTF8 treat the string in UTF8 units to determine its length. Functions that do not end in UTF8 will take each char as a unit to determine the length.

In the case that the padding is a string and if it is a UTF8 function it will be treated in UTF8 units, otherwise as chars.

The parameter totalWidth is based on function normal or UTF8.

FULLCODE


#include <iostream>
#include <set>
#include <string>
#include <locale>

// WINDOWS
#if (_WIN32)
#include <Windows.h>
#include <conio.h>
#define WINDOWS_PLATFORM 1
#define DLLCALL STDCALL
#define DLLIMPORT _declspec(dllimport)
#define DLLEXPORT _declspec(dllexport)
#define DLLPRIVATE
#define NOMINMAX

//EMSCRIPTEN
#elif defined(__EMSCRIPTEN__)
#include <emscripten/emscripten.h>
#include <emscripten/bind.h>
#include <unistd.h>
#include <termios.h>
#define EMSCRIPTEN_PLATFORM 1
#define DLLCALL
#define DLLIMPORT
#define DLLEXPORT __attribute__((visibility("default")))
#define DLLPRIVATE __attribute__((visibility("hidden")))

// LINUX - Ubuntu, Fedora, , Centos, Debian, RedHat
#elif (__LINUX__ || __gnu_linux__ || __linux__ || __linux || linux)
#define LINUX_PLATFORM 1
#include <unistd.h>
#include <termios.h>
#define DLLCALL CDECL
#define DLLIMPORT
#define DLLEXPORT __attribute__((visibility("default")))
#define DLLPRIVATE __attribute__((visibility("hidden")))
#define CoTaskMemAlloc(p) malloc(p)
#define CoTaskMemFree(p) free(p)

//ANDROID
#elif (__ANDROID__ || ANDROID)
#define ANDROID_PLATFORM 1
#define DLLCALL
#define DLLIMPORT
#define DLLEXPORT __attribute__((visibility("default")))
#define DLLPRIVATE __attribute__((visibility("hidden")))

//MACOS
#elif defined(__APPLE__)
#include <unistd.h>
#include <termios.h>
#define DLLCALL
#define DLLIMPORT
#define DLLEXPORT __attribute__((visibility("default")))
#define DLLPRIVATE __attribute__((visibility("hidden")))
#include "TargetConditionals.h"
#if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR
#define IOS_SIMULATOR_PLATFORM 1
#elif TARGET_OS_IPHONE
#define IOS_PLATFORM 1
#elif TARGET_OS_MAC
#define MACOS_PLATFORM 1
#else

#endif

#endif



typedef std::string String;
typedef std::wstring WString;

#define EMPTY_STRING u8""s
#define EMPTY_WSTRING L""s

using namespace std::literals::string_literals;

class Strings
{
public:
	static String WideStringToString(const WString& wstr)
	{
		if (wstr.empty())
		{
			return String();
		}
		size_t pos;
		size_t begin = 0;
		String ret;

#if WINDOWS_PLATFORM
		int size;
		pos = wstr.find(static_cast<wchar_t>(0), begin);
		while (pos != WString::npos && begin < wstr.length())
		{
			WString segment = WString(&wstr[begin], pos - begin);
			size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, &segment[0], segment.size(), NULL, 0, NULL, NULL);
			String converted = String(size, 0);
			WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, &segment[0], segment.size(), &converted[0], converted.size(), NULL, NULL);
			ret.append(converted);
			ret.append({ 0 });
			begin = pos + 1;
			pos = wstr.find(static_cast<wchar_t>(0), begin);
		}
		if (begin <= wstr.length())
		{
			WString segment = WString(&wstr[begin], wstr.length() - begin);
			size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, &segment[0], segment.size(), NULL, 0, NULL, NULL);
			String converted = String(size, 0);
			WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, &segment[0], segment.size(), &converted[0], converted.size(), NULL, NULL);
			ret.append(converted);
		}
#elif LINUX_PLATFORM || MACOS_PLATFORM || EMSCRIPTEN_PLATFORM
		size_t size;
		pos = wstr.find(static_cast<wchar_t>(0), begin);
		while (pos != WString::npos && begin < wstr.length())
		{
			WString segment = WString(&wstr[begin], pos - begin);
			size = wcstombs(nullptr, segment.c_str(), 0);
			String converted = String(size, 0);
			wcstombs(&converted[0], segment.c_str(), converted.size());
			ret.append(converted);
			ret.append({ 0 });
			begin = pos + 1;
			pos = wstr.find(static_cast<wchar_t>(0), begin);
		}
		if (begin <= wstr.length())
		{
			WString segment = WString(&wstr[begin], wstr.length() - begin);
			size = wcstombs(nullptr, segment.c_str(), 0);
			String converted = String(size, 0);
			wcstombs(&converted[0], segment.c_str(), converted.size());
			ret.append(converted);
		}
#else
		static_assert(false, "Unknown Platform");
#endif
		return ret;
	}

	static WString StringToWideString(const String& str)
	{
		if (str.empty())
		{
			return WString();
		}

		size_t pos;
		size_t begin = 0;
		WString ret;
#ifdef WINDOWS_PLATFORM
		int size = 0;
		pos = str.find(static_cast<char>(0), begin);
		while (pos != std::string::npos) {
			std::string segment = std::string(&str[begin], pos - begin);
			std::wstring converted = std::wstring(segment.size() + 1, 0);
			size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, &segment[0], segment.size(), &converted[0], converted.length());
			converted.resize(size);
			ret.append(converted);
			ret.append({ 0 });
			begin = pos + 1;
			pos = str.find(static_cast<char>(0), begin);
		}
		if (begin < str.length()) {
			std::string segment = std::string(&str[begin], str.length() - begin);
			std::wstring converted = std::wstring(segment.size() + 1, 0);
			size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, segment.c_str(), segment.size(), &converted[0], converted.length());
			converted.resize(size);
			ret.append(converted);
		}

#elif LINUX_PLATFORM || MACOS_PLATFORM || EMSCRIPTEN_PLATFORM
		size_t size;
		pos = str.find(static_cast<char>(0), begin);
		while (pos != String::npos)
		{
			String segment = String(&str[begin], pos - begin);
			WString converted = WString(segment.size(), 0);
			size = mbstowcs(&converted[0], &segment[0], converted.size());
			converted.resize(size);
			ret.append(converted);
			ret.append({ 0 });
			begin = pos + 1;
			pos = str.find(static_cast<char>(0), begin);
		}
		if (begin < str.length())
		{
			String segment = String(&str[begin], str.length() - begin);
			WString converted = WString(segment.size(), 0);
			size = mbstowcs(&converted[0], &segment[0], converted.size());
			converted.resize(size);
			ret.append(converted);
		}
#else
		static_assert(false, "Unknown Platform");
#endif
		return ret;
	}

	static size_t LengthUTF8(const String& data)
	{
		size_t ret = 0;
		for (char value : data)
		{
			if ((value & 0xc0) != 0x80)
			{
				++ret;
			}
		}
		return ret;
	}

	static String SubstringUTF8(const String& data, size_t startIndex, size_t length)
	{
		size_t units = LengthUTF8(data);
		if (startIndex >= units)
		{
			throw std::invalid_argument(u8"Invalid UTF8 character position.");
		}
		String result;
		String::const_iterator it = data.begin();
		String::const_iterator beginIterator = data.begin();
		size_t endIndex = length == SIZE_MAX ? units : startIndex + length;
		size_t utf8pos = 0;
		while (it != data.end())
		{
			char value = *it;
			if ((value & 0xc0) != 0x80) // Es inicio de caracter //utf8pos = 0 / beginIterator = 0 / endIndex = 1+12
			{
				if (utf8pos == startIndex)
				{
					beginIterator = it;
					if (length >= units)
					{
						return String(beginIterator, data.end());
					}
				}

				if (utf8pos == endIndex)
				{
					break;
				}
				utf8pos += 1;
			}
			it++;
		}
		return String(beginIterator, it);
	}

	static String GetCharUTF8(const String& data, size_t pos)
	{
		return SubstringUTF8(data, pos, 1);
	}

	static String PadRight(const String& data, const size_t& totalWidth, const char& padding)
	{
		if (data.length() >= totalWidth)
		{
			return data;
		}
		String ret = data;
		ret.resize(totalWidth, padding);
		return ret;
	}

	static String PadLeft(const String& data, const size_t& totalWidth, const char& padding)
	{
		if (data.length() >= totalWidth)
		{
			return data;
		}
		String ret = data;
		ret.insert(0, totalWidth - ret.length(), padding);
		return ret;
	}

	static String PadRight(const String& data, const size_t& totalWidth, const String& padding)
	{

		if (data.length() >= totalWidth)
		{
			return data;
		}
		size_t modulo = (totalWidth - data.length()) % padding.length();
		size_t paddingUnits = (totalWidth - data.length()) / padding.length();
		String ret = data;
		for (size_t i = 0; i < paddingUnits; i++)
		{
			ret.append(padding);
		}
		ret.append(padding.substr(0, modulo));
		return ret;
	}

	static String PadLeft(const String& data, const size_t& totalWidth, const String& padding)
	{
		if (data.length() >= totalWidth)
		{
			return data;
		}
		size_t modulo = (totalWidth - data.length()) % padding.length();
		size_t paddingUnits = (totalWidth - data.length()) / padding.length();
		String ret = data;
		for (size_t i = 0; i < paddingUnits; i++)
		{
			ret.insert(0, padding);
		}
		ret.insert(0, padding.substr(0, modulo));
		return ret;
	}

	static String PadRightUTF8(const String& data, const size_t& totalWidth, const char& padding)
	{
		size_t totalUtf8 = LengthUTF8(data);
		if (totalUtf8 >= totalWidth)
		{
			return data;
		}
		String ret = data;
		ret.resize(ret.length() + (totalWidth - totalUtf8), padding);
		return ret;
	}

	static String PadLeftUTF8(const String& data, const size_t& totalWidth, const char& padding)
	{
		size_t totalUtf8 = LengthUTF8(data);
		if (totalUtf8 >= totalWidth)
		{
			return data;
		}
		String ret = data;
		ret.insert(0, totalWidth - totalUtf8, padding);
		return ret;
	}

	static String PadRightUTF8(const String& data, const size_t& totalWidth, const String& padding)
	{
		size_t units = LengthUTF8(data);
		size_t paddingUnits = LengthUTF8(padding);
		if (units >= totalWidth)
		{
			return data;
		}
		size_t modulo = (totalWidth - units) % paddingUnits;
		size_t n = (totalWidth - units) / paddingUnits;
		String ret = data;
		for (size_t i = 0; i < n; i++)
		{
			ret.append(padding);
		}
		ret.append(SubstringUTF8(padding, 0, modulo));
		return ret;
	}

	static String PadLeftUTF8(const String& data, const size_t& totalWidth, const String& padding)
	{
		size_t units = LengthUTF8(data);
		size_t paddingUnits = LengthUTF8(padding);
		if (units >= totalWidth)
		{
			return data;
		}
		size_t modulo = (totalWidth - units) % paddingUnits;
		size_t n = (totalWidth - units) / paddingUnits;
		String ret = data;
		for (size_t i = 0; i < n; i++)
		{
			ret.insert(0, padding);
		}
		ret.insert(0, SubstringUTF8(padding, 0, modulo));
		return ret;
	}


};

enum class ConsoleTextStyle
{
	DEFAULT = 0,
	BOLD = 1,
	FAINT = 2,
	ITALIC = 3,
	UNDERLINE = 4,
	SLOW_BLINK = 5,
	RAPID_BLINK = 6,
	REVERSE = 7,
};

enum class ConsoleForeground
{
	DEFAULT = 39,
	BLACK = 30,
	DARK_RED = 31,
	DARK_GREEN = 32,
	DARK_YELLOW = 33,
	DARK_BLUE = 34,
	DARK_MAGENTA = 35,
	DARK_CYAN = 36,
	GRAY = 37,
	DARK_GRAY = 90,
	RED = 91,
	GREEN = 92,
	YELLOW = 93,
	BLUE = 94,
	MAGENTA = 95,
	CYAN = 96,
	WHITE = 97
};

enum class ConsoleBackground
{
	DEFAULT = 49,
	BLACK = 40,
	DARK_RED = 41,
	DARK_GREEN = 42,
	DARK_YELLOW = 43,
	DARK_BLUE = 44,
	DARK_MAGENTA = 45,
	DARK_CYAN = 46,
	GRAY = 47,
	DARK_GRAY = 100,
	RED = 101,
	GREEN = 102,
	YELLOW = 103,
	BLUE = 104,
	MAGENTA = 105,
	CYAN = 106,
	WHITE = 107
};

class Console //For Printing Unicode strings.
{
private:
	static void EnableVirtualTermimalProcessing()
	{
#if defined WINDOWS_PLATFORM
		HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
		DWORD dwMode = 0;
		GetConsoleMode(hOut, &dwMode);
		if (!(dwMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING))
		{
			dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
			SetConsoleMode(hOut, dwMode);
		}
#endif
	}

	static void ResetTerminalFormat()
	{
		std::cout << u8"\033[0m";
	}

	static void SetVirtualTerminalFormat(ConsoleForeground foreground, ConsoleBackground background, std::set<ConsoleTextStyle> styles)
	{
		String format = u8"\033[";
		format.append(std::to_string(static_cast<int>(foreground)));
		format.append(u8";");
		format.append(std::to_string(static_cast<int>(background)));
		if (styles.size() > 0)
		{
			for (auto it = styles.begin(); it != styles.end(); ++it)
			{
				format.append(u8";");
				format.append(std::to_string(static_cast<int>(*it)));
			}
		}
		format.append(u8"m");
		std::cout << format;
	}
public:
	static void Clear()
	{

#ifdef WINDOWS_PLATFORM
		std::system(u8"cls");
#elif LINUX_PLATFORM || defined MACOS_PLATFORM
		std::system(u8"clear");
#elif EMSCRIPTEN_PLATFORM
		emscripten::val::global()["console"].call<void>(u8"clear");
#else
		static_assert(false, "Unknown Platform");
#endif
	}

	static void Write(const String& s, ConsoleForeground foreground = ConsoleForeground::DEFAULT, ConsoleBackground background = ConsoleBackground::DEFAULT, std::set<ConsoleTextStyle> styles = {})
	{
#ifndef EMSCRIPTEN_PLATFORM
		EnableVirtualTermimalProcessing();
		SetVirtualTerminalFormat(foreground, background, styles);
#endif
		String str = s;
#ifdef WINDOWS_PLATFORM
		WString unicode = Strings::StringToWideString(str);
		WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), unicode.c_str(), static_cast<DWORD>(unicode.length()), nullptr, nullptr);
#elif defined LINUX_PLATFORM || defined MACOS_PLATFORM || EMSCRIPTEN_PLATFORM
		std::cout << str;
#else
		static_assert(false, "Unknown Platform");
#endif

#ifndef EMSCRIPTEN_PLATFORM
		ResetTerminalFormat();
#endif
	}

	static void WriteLine(const String& s, ConsoleForeground foreground = ConsoleForeground::DEFAULT, ConsoleBackground background = ConsoleBackground::DEFAULT, std::set<ConsoleTextStyle> styles = {})
	{
		Write(s, foreground, background, styles);
		std::cout << std::endl;
	}

	static void Write(const WString& s, ConsoleForeground foreground = ConsoleForeground::DEFAULT, ConsoleBackground background = ConsoleBackground::DEFAULT, std::set<ConsoleTextStyle> styles = {})
	{
#ifndef EMSCRIPTEN_PLATFORM
		EnableVirtualTermimalProcessing();
		SetVirtualTerminalFormat(foreground, background, styles);
#endif
		WString str = s;

#ifdef WINDOWS_PLATFORM
		WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str.c_str(), static_cast<DWORD>(str.length()), nullptr, nullptr);
#elif LINUX_PLATFORM || MACOS_PLATFORM || EMSCRIPTEN_PLATFORM
		std::cout << Strings::WideStringToString(str);
#else
		static_assert(false, "Unknown Platform");
#endif

#ifndef EMSCRIPTEN_PLATFORM
		ResetTerminalFormat();
#endif
	}

	static void WriteLine(const WString& s, ConsoleForeground foreground = ConsoleForeground::DEFAULT, ConsoleBackground background = ConsoleBackground::DEFAULT, std::set<ConsoleTextStyle> styles = {})
	{
		Write(s, foreground, background, styles);
		std::cout << std::endl;
	}

	static void WriteLine()
	{
		std::cout << std::endl;
	}

	static void Pause()
	{
		char c;
		do
		{
			c = getchar();
			std::cout << "Press Key " << std::endl;
		} while (c != 64);
		std::cout << "KeyPressed" << std::endl;
	}

	static int PauseAny(bool printWhenPressed = false, ConsoleForeground foreground = ConsoleForeground::DEFAULT, ConsoleBackground background = ConsoleBackground::DEFAULT, std::set<ConsoleTextStyle> styles = {})
	{
		int ch;
#ifdef WINDOWS_PLATFORM
		ch = _getch();
#elif LINUX_PLATFORM || MACOS_PLATFORM || EMSCRIPTEN_PLATFORM
		struct termios oldt, newt;
		tcgetattr(STDIN_FILENO, &oldt);
		newt = oldt;
		newt.c_lflag &= ~(ICANON | ECHO);
		tcsetattr(STDIN_FILENO, TCSANOW, &newt);
		ch = getchar();
		tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
#else
		static_assert(false, "Unknown Platform");
#endif
		if (printWhenPressed)
		{
			Console::Write(String(1, ch), foreground, background, styles);
		}
		return ch;
	}
};



int main()
{

	//u8"🐢" 4 char units

	char charPadding = u8'@';
	std::string stringPadding = u8"<>"s;
	std::string unicodeStringPadding = u8"🐢"s;
	
	std::locale::global(std::locale(u8"en_US.UTF8"));

	//No UTF8 examples
	String str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeft(str, 10, charPadding) + u8" β–ˆ PadLeft with char padding");//"Hello 🐢" No changes. Length 10 == totalWith 10
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeft(str, 15, charPadding) + u8" β–ˆ PadLeft with char padding");//"@@@@@Hello 🐢"

	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRight(str, 10, charPadding) + u8" β–ˆ PadRight with char padding");//"Hello 🐢" No changes. Length 10 == totalWith 10
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRight(str, 15, charPadding) + u8" β–ˆ PadRight with char padding");//"Hello 🐢@@@@@"

	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeft(str, 10, stringPadding) + u8" β–ˆ PadLeft with string padding");//"Hello 🐢" No changes. Length 10 == totalWith 10
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeft(str, 15, stringPadding) + u8" β–ˆ PadLeft with string padding");//"<<><>Hello 🐢"

	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRight(str, 10, stringPadding) + u8" β–ˆ PadRight with string padding");//"Hello 🐢" No changes. Length 10 == totalWith 10
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRight(str, 15, stringPadding) + u8" β–ˆ PadRight with string padding");//"Hello 🐢<><><"

	//UTF8 Examples
	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeftUTF8(str, 7, charPadding) + u8" β–ˆ PadLeftUTF8 with char padding");//"Hello 🐢" No changes. UTF8Length 7 == totalWith 7
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeftUTF8(str, 15, charPadding) + u8" β–ˆ PadLeftUTF8 with char padding");//"@@@@@@@@Hello 🐢"

	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRightUTF8(str, 7, charPadding) + u8" β–ˆ PadRightUTF8 with char padding");//"Hello 🐢" No changes. UTF8Length 7 == totalWith 7
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRightUTF8(str, 15, charPadding) + u8" β–ˆ PadRightUTF8 with char padding");//"Hello 🐢@@@@@@@@"

	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeftUTF8(str, 7, unicodeStringPadding) + u8" β–ˆ PadLeftUTF8 with string padding");//"Hello 🐢" No changes. UTF8Length 7 == totalWith 7
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadLeftUTF8(str, 15, unicodeStringPadding) + u8" β–ˆ PadLeftUTF8 with string padding");//"🐢🐢🐢🐢🐢🐢🐢🐢Hello 🐢"

	str = u8"Hello 🐢"s;
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRightUTF8(str, 7, unicodeStringPadding) + u8" β–ˆ PadRightUTF8 with string padding");//"Hello 🐢" No changes. UTF8Length 7 == totalWith 7
	Console::WriteLine(u8"Original: " + str + u8" β–ˆ StrLength: " + std::to_string(str.length()) + u8" β–ˆ UTF8Chars: " + std::to_string(Strings::LengthUTF8(str)) + u8" β–ˆ Padded:" + Strings::PadRightUTF8(str, 15, unicodeStringPadding) + u8" β–ˆ PadRightUTF8 with string padding");//"Hello 🐢🐢🐢🐢🐢🐢🐢🐢🐢"

	Console::WriteLine();
	Console::WriteLine(u8"Press any key to exit"s, ConsoleForeground::DARK_GRAY);
	Console::PauseAny();

}

Output

Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadLeft with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:@@@@@Hello 🐢 β–ˆ PadLeft with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadRight with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢@@@@@ β–ˆ PadRight with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadLeft with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:<<><>Hello 🐢 β–ˆ PadLeft with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadRight with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢<><>< β–ˆ PadRight with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadLeftUTF8 with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:@@@@@@@@Hello 🐢 β–ˆ PadLeftUTF8 with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadRightUTF8 with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢@@@@@@@@ β–ˆ PadRightUTF8 with char padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadLeftUTF8 with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:🐢🐢🐢🐢🐢🐢🐢🐢Hello 🐢 β–ˆ PadLeftUTF8 with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢 β–ˆ PadRightUTF8 with string padding
Original: Hello 🐢 β–ˆ StrLength: 10 β–ˆ UTF8Chars: 7 β–ˆ Padded:Hello 🐢🐢🐢🐢🐢🐢🐢🐢🐢 β–ˆ PadRightUTF8 with string padding

Using the new Windows Terminal can draw unicode glyps-emoticons. Using Microsoft Visual C++ compiler with Visual studio + /std:c++17 + /utf-8 :

Windows Terminal, windows, visual studio, msvc

Using classic console cmd.exe poor drawing

cmd, windows, visual studio, msvc

Output in repl.it, using Linux + Clang + std=c++17 https://repl.it/@JomaCorpFX/Padding#main.cpp

Linux, clang

Solution 11 - C++

I was looking the topic because Im developing VCL; Anyway making a function wasn't not so hard.

void addWhiteSpcs(string &str, int maxLength) {
    int i, length;

    length = str.length();
    for(i=length; i<maxLength; i++)
    str += " ";
};

string name1 = "johnny";
string name2 = "cash";

addWhiteSpcs(name1, 10);
addWhiteSpcs(name2, 10);

In both cases it will add to the right 10 blank spaces. I Recomend to use monospace fonts like courier or consolas for a correct format.

This is what happens when you're not using monospace font
johnny____
cash______

// using monospace font the output will be
johnny____
cash______

Both cases have the same length.

Solution 12 - C++

If you want to pad without using streams:

std::size_t pad_size = 10, value = 123;
std::string t = std::string(pad_size , ' ') + std::to_string(value);
std::string padded = t.substr(std::min(t.size() - pad_size, pad_size));

[Try it online!](https://tio.run/##ZY7BDoIwEETv/YpNPAARDOoNkF8htW1Ik1II3XrQ@O11LYok9jSdmX0ZMU2FMNz2Iey0FcZLBY0eHc6KDy37eeRo27eMaYswcG3TDB4M6DmUVeX0XXUIE5fdW8IFjmUON2581KdzvelGFCAFm3@63uaQQJLBfklx7D6FSMv@QXQolSQaHpy/kpnGdKCN5BCRphbrtHxV2ZYlRo/QNF8YqWgrK83SmhX62UJZs2cILw "C++ (clang) – Try It Online")

Solution 13 - C++

How about this one:

const int column_len = 50;
string s;
s = "....some value ... ";
int fill_pad = column_len - s.length();
std::cout << s << std::setw(fill_pad) << " Second column " << other_field << std::endl;

Solution 14 - C++

Create a new string of 10 spaces, and work backwards in both string.

string padstring(const string &source, size_t totalLength, char padChar)
{
	if (source.length() >= totalLength) 
		return source;

	string padded(totalLength, padChar);
	string::const_reverse_iterator iSource = source.rbegin();
	string::reverse_iterator iPadded = padded.rbegin();
	for (;iSource != source.rend(); ++iSource, ++iPadded)
		*iPadded = *iSource;
	return padded;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlex BView Question on Stackoverflow
Solution 1 - C++baydaView Answer on Stackoverflow
Solution 2 - C++Brian R. BondyView Answer on Stackoverflow
Solution 3 - C++NaveenView Answer on Stackoverflow
Solution 4 - C++greyfadeView Answer on Stackoverflow
Solution 5 - C++Francois NedelecView Answer on Stackoverflow
Solution 6 - C++Antti HuimaView Answer on Stackoverflow
Solution 7 - C++Andrew GrantView Answer on Stackoverflow
Solution 8 - C++Andy MikulaView Answer on Stackoverflow
Solution 9 - C++AleksandrView Answer on Stackoverflow
Solution 10 - C++JomaView Answer on Stackoverflow
Solution 11 - C++vincent thorpeView Answer on Stackoverflow
Solution 12 - C++ArtyView Answer on Stackoverflow
Solution 13 - C++Carlos CamargoView Answer on Stackoverflow
Solution 14 - C++EclipseView Answer on Stackoverflow