C ++에서 문자열 시작 부분에 ‘n’공백 (또는 임의의 문자열)을 삽입하고 싶습니다. std :: strings 또는 char * 문자열을 사용하여이를 수행하는 직접적인 방법이 있습니까?
예를 들어 Python에서는 간단히 할 수 있습니다.
>>> "." * 5 + "lolcat"
'.....lolcat'
답변
단일 문자를 반복하는 특별한 경우 다음을 사용할 수 있습니다 std::string(size_type count, CharT ch)
.
std::string(5, '.') + "lolcat"
NB. 다중 문자 문자열을 반복하는 데 사용할 수 없습니다.
답변
Python 의 * 연산자 또는 Perl 의 x 연산자에 해당하는 C ++에서 문자열을 반복하는 직접적인 관용적 방법은 없습니다 . 단일 문자를 반복하는 경우 이전 답변에서 제안한대로 두 인수 생성자가 잘 작동합니다.
std::string(5, '.')
다음은 ostringstream을 사용하여 문자열을 n 번 반복하는 방법에 대한 인위적인 예입니다.
#include <sstream>
std::string repeat(int n) {
std::ostringstream os;
for(int i = 0; i < n; i++)
os << "repeat";
return os.str();
}
구현에 따라 이것은 단순히 문자열을 n 번 연결하는 것보다 약간 더 효율적일 수 있습니다.
답변
string :: insert 형식 중 하나를 사용합니다.
std::string str("lolcat");
str.insert(0, 5, '.');
이렇게하면 문자열 시작 (위치 0)에 “…..”(점 5 개)가 삽입됩니다.
답변
나는 이것이 오래된 질문이라는 것을 알고 있지만 똑같은 일을 찾고 있었고 더 간단한 해결책이라고 생각하는 것을 발견했습니다. cout에는 cout.fill ()과 함께이 함수가 내장되어있는 것 같습니다. ‘전체’설명은 링크를 참조하십시오.
http://www.java-samples.com/showtutorial.php?tutorialid=458
cout.width(11);
cout.fill('.');
cout << "lolcat" << endl;
출력
.....lolcat
답변
OP std :: string의 ctor가 제공하는 예제의 목적을 위해 충분 std::string(5, '.')
합니다.. 그러나 누군가 std :: string을 여러 번 반복하는 함수를 찾고 있다면 :
std::string repeat(const std::string& input, unsigned num)
{
std::string ret;
ret.reserve(input.size() * num);
while (num--)
ret += input;
return ret;
}
답변
Commodore Jaeger가 언급했듯이, 나는 다른 답변 중 어떤 것도 실제로이 질문에 답하지 않는다고 생각합니다. 질문은 문자가 아닌 문자열을 반복하는 방법을 묻습니다.
Commodore가 제공 한 대답은 정확하지만 상당히 비효율적입니다. 다음은 더 빠른 구현입니다. 아이디어는 먼저 문자열을 기하 급수적으로 늘려 복사 작업 및 메모리 할당을 최소화하는 것입니다.
#include <string>
#include <cstddef>
std::string repeat(std::string str, const std::size_t n)
{
if (n == 0) {
str.clear();
str.shrink_to_fit();
return str;
} else if (n == 1 || str.empty()) {
return str;
}
const auto period = str.size();
if (period == 1) {
str.append(n - 1, str.front());
return str;
}
str.reserve(period * n);
std::size_t m {2};
for (; m < n; m *= 2) str += str;
str.append(str.c_str(), (n - (m / 2)) * period);
return str;
}
operator*
파이썬 버전에 더 가까운 것을 얻기 위해를 정의 할 수도 있습니다 .
#include <utility>
std::string operator*(std::string str, std::size_t n)
{
return repeat(std::move(str), n);
}
내 컴퓨터에서 이것은 Commodore가 제공 한 구현보다 약 10 배 빠르며 순진한 ‘append n-1 times’ 솔루션 보다 약 2 배 빠릅니다 .
답변
자신 만의 스트림 조작기를 작성해야합니다.
cout << multi (5) << “whatever”<< “lolcat”;