Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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) */

Ответ 2

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

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 ответ, но в некоторых случаях это не то, что вы хотите.

Ответ 3

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

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

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

Ответ 4

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

//Note destroys the original string by removing it 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);

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

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

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