2012-06-13 5 views
2

J'ai une fonctionC++ copie const char * char *

ClassA::FuncA(const char *filePath) 

et que vous souhaitez copier cette chaîne const char * à un char *!

Ma solution:

char *argv[2]; 
int length = strlen(filePath); 
argv[1] = new char(length +1); 
strncpy(argv[1], filePath, length); 

après je argv [1] les caractères souhaités, mais aussi d'autres caractères non définis!

filePath:

"C: \ Users \ userA \ Parameter.xmlþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþKŸQyá •"

Quel est le problème ici? La longueur avec strlen est OK!

Répondre

14

Comme si:

argv[1] = new char[length +1](); //() to value-initialize the array 

Votre version:

argv[1] = new char(length +1); 

alloue une seule char et la valeur initialisée à length+1.

+0

'argv [1] = nouveau caractère [longueur + 1]; strncpy (argv [1], filePath, length + 1); 'pourrait être plus rapide pour de grandes longueurs ?! Eh bien, dans la plupart des cas, cela ne compte pas, je suppose. – smerlin

+0

@smerlin quoi? –

+0

J'ai appuyé sur Entrée pour un retour à la ligne ... bien ne fonctionne pas dans les commentaires, donc mon commentaire incomplet était visible pendant une seconde. vous devez vite! – smerlin

0

strncpy() copies au plus length caractères. Ce faisant, la fin \0 n'a pas été copiée.

1

Vous avez deux problèmes dans votre code:

  • Vous devez ajouter 1 à la longueur après la copie pour copier le caractère nul (comme les retours strlen que nombre de caractères sans caractère nul, voir plus here) . Changez le code en:

    strncpy (argv [1], filePath, longueur + 1);

  • Vous devez corriger la façon dont votre tableau est initialisé lorsque vous initialisez un seul caractère (et nous supposons que vous voulez que la chaîne complète soit copiée). Donc:

    argv [1] = nouveau caractère [longueur + 1]();


Notes:

  • S'il vous plaît lorsque vous publiez aussi poster le code qui a été utilisé pour imprimer des données comme des problèmes tels que ceux-ci dans beaucoup de cas dépendent de ce que vous appelez pour imprimer Les données.
  • Et à la fin, vous pourriez envisager d'utiliser seulement un tableau de taille fixe qui est initialisé au chemin maximum. Pour la taille max chemin dans les fenêtres caisse suivant post
1

Le problème est que vous utilisez strncpy, plutôt que strcpy. Et la façon dont vous l'utilisez, il ne copie pas la terminaison \0.

En pratique, étant donné que strncpy peut laisser une chaîne sans un terminateur \0, il est préférable de l'éviter. Dans votre cas, strcpy seul est correct, puisque vous venez d'allouer un tampon suffisamment grand. Dans le cas plus général, vous devrez peut-être utiliser strlen, pour vous assurer que la chaîne que vous avez correspond au tampon cible (sans jamais oublier d'ajouter 1 aux résultats, pour le \0).

Si la situation se produit beaucoup, vous pouvez écrire votre propre version de strncpy, qui travaille (à savoir garantit une terminaison \0 et ne copie pas ou écrire plus de caractères que nécessaire). Quelque chose comme:

void 
stringCopy(char* dest, int maxLength, char const* source) 
{ 
    assert(maxLength > 0); 
    char* end = dest + maxLength - 1; 
    while (dest != end && *source != '\0') { 
     *dest = *source; 
     ++ dest; 
     ++ source; 
    } 
    *dest = '\0'; 
} 

(. Cette fonction existe en fait, sous le nom strcpy_s en C 2011, mais il est pas largement mis en œuvre, Microsoft a, mais je l'ai pas vu ailleurs)