Убрать первый и последний символ из строки C - PullRequest
25 голосов
/ 13 ноября 2009

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

Ответы [ 4 ]

52 голосов
/ 13 ноября 2009

Чтобы «удалить» 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) */
11 голосов
/ 13 ноября 2009

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

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

1 голос
/ 05 июля 2012

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

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

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

1 голос
/ 13 ноября 2009

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

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

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

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 для второго способа, если не хотите реализовывать его самостоятельно.

...