2010-02-27 5 views
1

У меня есть строка, которую я хочу скопировать в строку с фиксированной длиной. Например, у меня есть string s = "this is a string" длиной 16 символов.Как скопировать строку в строку фиксированной длины в C++

Я хочу скопировать это в строку с фиксированной длиной s2 длиной 4 символа. Таким образом, s2 будет содержать "this".

Я также хочу скопировать его в строку фиксированной длины s3 длиной 20 символов. Конец строки будет иметь дополнительные пробелы, так как исходная строка имеет длину всего 16 символов.

+1

Что вы считаете «строкой фиксированной длины»? Массив символов, как в C? – sbi

+3

Почему бы не указать отключенный интерфейс (и пример использования), чтобы ответы могли просто предложить реализацию? – mlvljr

+0

Символьный массив является примером строки фиксированной длины. – neuromancer

ответ

6
s.resize(expected_size,' '); 
+0

+1: ваше решение является самым чистым – Vlad

+0

+1, 'std :: string (orig_s) .resize (expected_size, '')'? :)) – mlvljr

3

Если вы используете зЬй :: строку, посмотрите на substr скопировать первую часть строки, конструктор string(const char *s, size_t n) создать строку длины n с содержанием s (неоднократного) и replace замены частей ваша пустая строка, они сделают эту работу для вас.

1

substr и resize/replace будет делать то, что вы хотите:

#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    string s = "abcdabcdabcdabcd"; 
    string t; 
    string u; 

    t = s.substr(0,4); 
    u = s; 
    u.resize(20, ' '); 

    string v(20, ' '); 
    v.replace(0, s.length(), s); 

    cout << "(" << s << ")" << endl 
     << "(" << t << ")" << endl 
     << "(" << u << ")" << endl 
     << "(" << v << ")" << endl; 
}  
1

Если вы хотите что-то многоразовый вы можете написать пару вспомогательных функций:

// Non-mutating version of string::resize 
std::string resize_copy(std::string const & str, std::size_t new_sz) 
{ 
    std::string copy = str; 
    copy.resize(new_sz); 
    return copy; 
} 

void resize_to(std::string const & str, std::string & dest) 
{ 
    dest = resize_copy(str, dest.size()); 
} 

int main() 
{ 
    std::string a = "this is a string"; 
    std::string b(4, ' '); 
    std::string c(20, ' '); 
    resize_to(a, b); 
    resize_to(a, c); 
    std::cout << b << "|\n" << c << "|\n"; 
} 

Печатается:

this| 
this is a string | 
0

Для строк с нулевым завершением вы можете использование sprintf.

Пример:

char* s1 = "this is a string"; 
    char s2[10]; 
    int s2_size = 4; 
    sprintf(s2, "%-*.*s", s2_size, s2_size, s1); 
    printf("%s\n", s2); 

%-*.*s спецификаторы формата регулировки размера строки и лишних пробелов, если это необходимо.

-1

Для обработки строк фиксированной длины в C++ используйте функции C lib, такие как strncpy.

+0

Почему голос? Кроме того, строки с фиксированной длиной не имеют окончательного «\ 0», это своего рода избыток, используя абстракцию в этом случае. – Spidey