web-dev-qa-db-fra.com

Supprimer le premier et le dernier caractère de la chaîne C

J'ai une chaîne C qui ressemble à "Nmy stringP", où N et P peuvent être n'importe quel caractère. Comment puis-je le modifier dans "my string" en C?

25
igul222

Pour "supprimer" le premier caractère, pointez sur le deuxième caractère:

char mystr[] = "Nmy stringP";
char *p = mystr;
p++; /* 'N' is not in `p` */

Pour supprimer le dernier caractère, remplacez-le par un '\ 0'

p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */
53
pmg

Une autre option, en supposant encore une fois que "modifier" signifie que vous souhaitez modifier en place:

void topntail(char *str) {
    size_t len = strlen(str);
    assert(len >= 2); // or whatever you want to do with short strings
    memmove(str, str+1, len-2);
    str[len-2] = 0;
}

Cela modifie la chaîne en place, sans générer une nouvelle adresse comme le fait la solution de pmg. Non pas qu'il y ait quelque chose de mal avec la réponse de pmg, mais dans certains cas, ce n'est pas ce que vous voulez.

11
Steve Jessop

Suite à la réponse de @ pmg, notez que vous pouvez effectuer les deux opérations dans une seule instruction:

char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;

Cela fonctionnera probablement comme prévu, mais le comportement n'est pas défini dans la norme C.

1
Will Daniels

Le moyen le plus efficace:

//Note destroys the original string by removing it's last char
// Do not pass in a string literal.
char * getAllButFirstAndLast(char *input)
{
  int len = strlen(input); 
  if(len > 0)
    input++;//Go past the first char
  if(len > 1)
    input[len - 2] = '\0';//Replace the last char with a null termination
  return input;
}


//...
//Call it like so
char str[512];
strcpy(str, "hello world");
char *pMod = getAllButFirstAndLast(str);

Le moyen le plus sûr:

void getAllButFirstAndLast(const char *input, char *output)
{
  int len = strlen(input);
  if(len > 0)
    strcpy(output, ++input);
  if(len > 1)
    output[len - 2] = '\0';
}


//...
//Call it like so
char mod[512];
getAllButFirstAndLast("hello world", mod);

La deuxième façon est moins efficace mais elle est plus sûre car vous pouvez passer des littéraux de chaîne en entrée. Vous pouvez également utiliser strdup pour la deuxième façon si vous ne souhaitez pas l'implémenter vous-même.

1
Brian R. Bondy