Удалить первый и последний символ из строки C

у меня есть строка C, которая выглядит как "Nmy stringP", где N и P могут быть любым символом. Как я могу отредактировать его в "my string" в C?

4 ответов


чтобы "удалить" 1-й символ, укажите на второй символ:

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

чтобы удалить последний символ, замените его на '\0'

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

другой вариант, опять же предполагая, что "редактировать" означает, что вы хотите изменить на месте:

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

это изменяет строку на месте, не генерируя новый адрес, как это делает решение pmg. Не то чтобы в ответе pmg было что-то не так, но в некоторых случаях это не то, что вы хотите.


самый эффективный способ:

//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] = '';//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);

самый безопасный способ:

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


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

второй способ менее эффективен, но он безопаснее, потому что вы можете передавать строковые литералы во вход. Вы также можете использовать strdup для второго способа, Если вы не хотите реализовать его самостоятельно.


далее к ответу @pmg обратите внимание, что вы можете выполнять обе операции в одном операторе:

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

Это, вероятно, будет работать, как ожидалось, но поведение не определено в стандарте C.