Вырежьте часть строки - PullRequest
       12

Вырежьте часть строки

4 голосов
/ 12 февраля 2009

Я не прочь написать свою собственную функцию для этого, но мне было интересно, существует ли она в string.h или существует стандартный способ сделать это.

char *string = "This is a string";

strcut(string, 4, 7);

printf("%s", string); // 'This a string'

Спасибо! * * 1004

Ответы [ 6 ]

7 голосов
/ 12 февраля 2009

Используйте memmove для перемещения хвоста, затем поставьте '\ 0' в новой конечной позиции. Будьте осторожны, чтобы не использовать memcpy - его поведение в этой ситуации не определено, поскольку источник и пункт назначения обычно перекрываются.

4 голосов
/ 20 февраля 2009

Вы можете просто сказать printf , чтобы вырезать для вас интересные детали:

char *string = "This is a string";
printf("%.*s%s", 4, string, &string[7]); // 'This a string'

: -)

1 голос
/ 12 февраля 2009

Если вы говорите о том, чтобы избавиться от середины строки и переместить остальное на место раньше, то я не думаю, что для этого есть стандартная библиотечная функция.

Наилучшим подходом было бы найти конец строки, а затем выполнить цикл O (cut_size) для смещения всех символов в новое место. На самом деле, есть похожий общий вопрос интервью.

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

0 голосов
/ 22 февраля 2017

Я уже написал ответ для аналогичной проблемы там https://stackoverflow.com/a/42283266/6003870. Он подходит для общих действий и основан в основном на функции strncpy () из стандартной библиотеки C. Но эту проблему можно решить с помощью функции memmove () , как упомянуто мертвым пользователем @ sharptooth.

Функция str_slice_in_place () использует memmove () в качестве базы и поддерживает положительные индексы.

int
str_slice_in_place(char str[], const int index_from, const int index_to)
{
    // a support for only positive indexes
    if (index_from < 0 || index_to < 0)
        return -1;

    int len = index_to - index_from;

    // "index_from" is more than "index_to"
    if (len < 0)
        return -1;

    memmove(str, str + index_from, len);
    str[len] = '\0';
    return 0;
}

Я также покажу вам код функции main () и примеры использования этой функции.

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

int
main()
{
    char line[] = "--------------------------------------";

    char str1[] = "Remember a good";
    char str2[] = "Remember a good";
    char str3[] = "Remember a good";
    char str4[] = "Remember a good";

    printf("|     Original     | Slice  | Result \n%s\n", line);

    printf("| %s | ", str1);
    str_slice_in_place(str1, 0, 8);
    printf("(%d, %d) | %s\n", 0, 8, str1);

    printf("| %s | ", str2);
    str_slice_in_place(str2, 3, 9);
    printf("(%d, %d) | %s\n", 3, 9, str2);

    printf("| %s | ", str3);
    str_slice_in_place(str3, 0, 1);
    printf("(%d, %d) | %s\n", 0, 1, str3);

    printf("| %s | ", str4);
    str_slice_in_place(str4, 1, 1);
    printf("(%d, %d) | %s\n", 1, 1, str4);

    puts(line);

    return 0;
}

Выход

|     Original     | Slice  | Result 
--------------------------------------
| Remember a good | (0, 8) | Remember
| Remember a good | (3, 9) | ember 
| Remember a good | (0, 1) | R
| Remember a good | (1, 1) | 
--------------------------------------

Среда тестирования

$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.6 (jessie)
Release:    8.6
Codename:   jessie
$ uname -a
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
0 голосов
/ 20 февраля 2009

Вы можете достичь желаемого и избежать написания новой функции с комбинацией strncpy и strcat:

#include <stdio.h>
#include <string.h>
int main(void)
{
  char   newStr[10];
  char   origStr[] = "This is a string";
  strncpy(newStr, origStr, 4);
  strcat(newStr, &origStr[7]);
  printf("newStr = %s\n", newStr);
  return(0);
}

Для меня это выводит "This a string" (цитирует мою), используя бесплатный компилятор командной строки Borland в Windows XP. Вы можете проверить string.h по адресу: http://opengroup.org/onlinepubs/007908799/xsh/string.h.html

0 голосов
/ 12 февраля 2009

Если вы делаете это в C и знаете смещение, то это довольно просто.

char string[] = "my string";
char *substring;
substring = &string[2];

printf("%s", substring);

РЕДАКТИРОВАТЬ: Если вы хотите сдвинуть строку.

char string[] = "my string";

int i = 0;
int offset = 2;

for( i = 0; string[i+offset] != '\0'; i++ ) {
 string[i] = string[i + offset];
}
string[i] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...