web-dev-qa-db-fra.com

Comment tronquer C char *?

Aussi simple que cela. Je suis sur C++ btw. J'ai lu les fonctions de la bibliothèque cstdlib de cplusplus.com, mais je ne trouve pas de fonction simple pour cela. Je connais la longueur du caractère, il me suffit de en effacer les trois derniers caractères. Je peux utiliser la chaîne C++, mais c'est pour gérer des fichiers, qui utilisent char *, et je ne veux pas faire de conversions de chaîne en C.

10
erandros

Si vous n'avez pas besoin de copier la chaîne ailleurs et que vous pouvez la changer

/* make sure strlen(name) >= 3 */
namelen = strlen(name); /* possibly you've saved the length previously */
name[namelen - 3] = 0;

Si vous avez besoin de le copier (parce que c'est un littéral de chaîne ou si vous voulez conserver l'original)

/* make sure strlen(name) >= 3 */
namelen = strlen(name); /* possibly you've saved the length previously */
strncpy(copy, name, namelen - 3);
/* add a final null terminator */
copy[namelen - 3] = 0;
23
pmg

Je pense qu'une partie de votre message a été perdue dans la traduction.

Pour tronquer une chaîne en C, vous pouvez simplement insérer un caractère nul final à la position souhaitée. Toutes les fonctions standard traiteront alors la chaîne comme ayant la nouvelle longueur.

#include <stdio.h>
#include <string.h>

int main(void)
{
    char string[] = "one one two three five eight thirteen twenty-one";

    printf("%s\n", string);

    string[strlen(string) - 3]  = '\0';

    printf("%s\n", string);

    return 0;
}
6
thelionroars1337

Si vous connaissez la longueur de la chaîne, vous pouvez utiliser l'arithmétique de pointeur pour obtenir une chaîne contenant les trois derniers caractères:

const char* mystring = "abc123";
const int len = 6;

const char* substring = mystring + len - 3;

Veuillez noter que substring pointe vers la même mémoire que mystring et n’est valide que tant que mystring est valide et reste inchangé. Cela fonctionne parce qu'une chaîne c n'a pas de marqueur spécial au début, seule la terminaison NULL à la fin.

J'ai interprété votre question comme voulant les trois derniers caractères, se débarrasser du début, par opposition à la façon dont David Heffernan l'a lue, l'un de nous est évidemment faux.

4
Anders Abel
bool TakeOutLastThreeChars(char* src, int len) {
  if (len < 3) return false;
  memset(src + len - 3, 0, 3);
  return true;
}

Je suppose que la mutation de la mémoire de chaîne est sûre puisque vous avez dit effacer les trois derniers caractères. J'écrase simplement les trois derniers caractères avec "NULL" ou 0.

0
cdiggins

Il peut être utile de comprendre le fonctionnement de C char* "chaînes":

Vous commencez à les lire à partir du caractère indiqué par le caractère * jusqu'à atteindre un caractère \0 (ou tout simplement 0).

Donc si j'ai

char* str = "theFile.nam";

alors str+3 représente la chaîne File.nam.

Mais vous voulez supprimer les trois derniers caractères, vous voulez donc quelque chose comme:

char str2[9];
strncpy (str2,str,8); // now str2 contains "theFile.#" where # is some character you don't know about
str2[8]='\0'; // now str2 contains "theFile.\0" and is a proper char* string.
0
trutheality