2010-02-27 6 views
1

J'ai une chaîne que je veux copier dans une chaîne de longueur fixe. Par exemple, j'ai un string s = "this is a string" de 16 caractères.Comment copier une chaîne dans une chaîne de longueur fixe en C++

Je veux copier ceci dans une chaîne de longueur fixe s2 de 4 caractères. Donc s2 contiendra "this". Je veux également le copier dans une chaîne de longueur fixe s3 qui a une longueur de 20 caractères. La fin de la chaîne aura des espaces supplémentaires puisque la chaîne d'origine n'a que 16 caractères.

+1

Que considérez-vous comme une "chaîne de longueur fixe"? Un tableau de caractères comme en C? – sbi

+3

Pourquoi ne pas spécifier l'interface désirée (et l'exemple d'utilisation), de sorte que les réponses pourraient simplement suggérer une implémentation? – mlvljr

+0

Un tableau de caractères est un exemple de chaîne de longueur fixe. – neuromancer

Répondre

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

+1: votre solution est la plus propre – Vlad

+0

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

3

Si vous utilisez std :: string, regardez substr pour copier la première partie d'une chaîne, le constructeur string(const char *s, size_t n) pour créer une chaîne de longueur n avec un contenu s (répété) et replace pour remplacer les pièces de votre chaîne vide, ceux-ci feront le travail pour vous.

1

substr et resize/replace fera ce que vous voulez:

#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

Si vous voulez quelque chose réutilisable vous pouvez écrire quelques fonctions d'aide:

// 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"; 
} 

Cette impression:

this| 
this is a string | 
0

Pour les chaînes terminées NULL, vous pouvez utiliser sprintf.

Exemple:

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 spécificateurs de format ajuster la taille de chaîne et ajouter des espaces supplémentaires si cela est nécessaire.

-1

Pour gérer des chaînes de longueur fixe en C++, utilisez les fonctions C lib, telles que strncpy.

+0

Pourquoi le vote à la baisse? De plus, les chaînes de longueur fixe n'ont pas le '\ 0' final, c'est une sorte d'overkill utilisant une abstraction dans ce cas. – Spidey

Questions connexes