2010-09-17 5 views
0

Je veux prendre une chaîne et remplir un tableau avec ses valeurs. Je sais que la longueur de la chaîne est 16. Je l'ai essayéconvertir String.data() en un tableau

char *bit_number[16]; 
bit_number = bin.data(); 

et

char bit_number[16]; 
bit_number = bin.data(); 

Je ne comprends pas ce que String.data() retourne, pourquoi ne puis-je attribuer directement à un tableau? Je reçois des erreurs du compilateur:

error: incompatible types in assignment of ‘const char*’ to ‘char* [16]’ 

et

error: incompatible types in assignment of ‘const char*’ to ‘char [16]’ 
+0

L'erreur est en fait assez claire. 'bit_number' n'est pas un tableau de 16' char' comme prévu, mais un tableau de 16 'char *'. –

+0

Peut-être s'attendait-il à ce que ce soit un pointeur vers un 'char [16]'. –

Répondre

1

Vous pouvez utiliser std::string::c_str() pour accéder à la matrice char, puis utiliser strcpy pour le déplacer vers la nouvelle matrice.

string s = "1234"; 
char arr[5] = { 0 }; 
strcpy(arr, s.c_str()); 
+2

Pourquoi, dans l'amour des twinkies, utiliseriez-vous 'strcpy' quand' copy' est juste là, attendant que vous l'utilisiez? –

+0

@John: 'copy' ne copie pas le terminateur null. Si vous travaillez avec des chaînes c'est très important (cependant, vous pouvez contourner cela en initialisant le tableau à 0 comme je l'ai fait ci-dessus). – Paul

+2

@Paul: le questionneur * dit * que la longueur de la chaîne est de 16, et que la taille du tableau de destination est également de 16. Copier le terminateur NUL entraîne donc un débordement de la mémoire tampon. Si le questionneur * prévu * que le tableau n'a pas de place pour un terminateur, est une autre question. Vous avez fait le tableau 1 plus grand, peut-être inconsciemment et presque certainement correctement :-) –

4

Vous devez copier le contenu:

En supposant bin est un std::string:

char bit_numer[16]; 
copy(bin.begin(), bin.end(), bit_number); 

Ceci est toutes sortes de risqué, cependant. Et si votre bin a 17 caractères?

Par ailleurs, votre code d'origine:

char *bit_number[16];

... n'allouent pas un tableau de 16 char s que vous pouvez vous attendre. Il a alloué un tableau de 16 char*. Ce n'est probablement pas ce que vous voulez.

+0

@sbi: LOL combien de votes sont la limite?Je suis gêné de dire que je ne l'ai jamais atteint. :) –

+1

+1 pour la solution la plus propre –

1

Si vous voulez que le tableau dest soit terminé par un caractère nul, c'est une ligne de code supplémentaire, et peut-être un octet supplémentaire dans votre tableau cible pour l'adapter.

Dans votre premier exemple, vous avez un tableau de 16 pointeurs sur char. Ce n'est pas ce que tu veux. Dans votre deuxième exemple, vous avez les types corrects mais vous ne pouvez pas affecter directement le pointeur (renvoyé par data()) à la baie car leurs types ne sont pas compatibles - vous devez copier les données référencées d'un emplacement à l'autre .

1

Qu'est-ce que vous avez besoin que char tableau pour, de toute façon? Et êtes-vous sûr que tout ce qui est dans votre chaîne s'y adaptera? (Il y a toute une classe de bugs provenant de l'utilisation de tableaux, et un célèbre aussi:. Dépassements de mémoire tampon) Vous êtes très probablement beaucoup mieux à l'aide std::vector, qui redimensionne dynamiquement:

std::vector<char> v(bin.begin(), bin.end()); 

Si vous avez besoin le tableau pour le passer à une fonction C API qui ne sait pas comment gérer un std::vector, vous pouvez accéder au tableau sous-jacent du vecteur en faisant le peu cryptique &v[0] ou &*v.begin(). (Attention, vous devez vérifier si le vecteur n'est pas vide avant d'accéder à son premier élément.)

+0

'' Alors qu'est-ce qui ne va pas? (Vous avez une raison de voter en bas, n'est-ce pas?) – sbi

Questions connexes