Как вырезать часть строки в C?

Я пытаюсь выяснить, как вырезать часть строки В C. Например, у вас есть эта строка символов " собака умерла, потому что автомобиль ударил его, когда он переходил дорогу "как функция будет делать предложение" автомобиль ударил его при переходе дороги "или"автомобиль ударил его"

Как вы это делаете с библиотекой C (или/и) пользовательской функцией?

ок, у меня нет основного кода, но это будет структура этого эксперимента

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
#include "display_usage.c"/*If the user enters wrong arguments it will tell them how it should be */


void cut( const char *file, int option, int first, int last );


int main(int argc, char *argv[] ) {
FILE *fp;
    char ch;
    fp = fopen("test.txt", "r"); // Open file in Read mode

    while (ch!=EOF) {
        ch = fgetc(fp); // Read a Character

        printf("%c", ch);
    }
    fclose(fp); // Close File after Reading
   return 0;
}

void cut( const char *file, int reverse, int first, int last ) {



    return;
}

5 ответов


следующая функция вырезает заданный диапазон из буфера char. Диапазон определяется индексом startng и длиной. Отрицательная длина может быть указана для указания диапазона от начального индекса до конца строки.

/*
 *      Remove given section from string. Negative len means remove
 *      everything up to the end.
 */
int str_cut(char *str, int begin, int len)
{
    int l = strlen(str);

    if (len < 0) len = l - begin;
    if (begin + len > l) len = l - begin;
    memmove(str + begin, str + begin + len, l - len + 1);

    return len;
}

диапазон char вырезается путем перемещения всего после диапазона, включая завершение '' в индекс, начиная с memmove, тем самым перезаписывая диапазона. Текст в диапазоне теряется.

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


strncpy будет копировать только до n символы. При желании вы можете перемещать указатель в строке, а также придерживаться в массив, чтобы завершить его рано, если у вас есть записываемая память.


strstr было бы идеально для вас, если вы знаете содержимое строки.

пример:

char *str = "A dog died because a car hit him while he was crossing the road.";
char *pCh = strstr(str, "dog");

pCh будет иметь адрес 'd' на "dog".


для такой проблемы лучше написать собственную функцию, это займет время, но это окупится. Код функции str_slice показано ниже, очень похоже на функцию JavaScripts строку.ломтик (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice) и к функции Python для создания среза на строках или массивах (https://docs.python.org/3.5/library/functions.html#slice).

Он также основан только на стандартной библиотеке C, поэтому должен быть кросс-платформенным и работать с любым компилятором. Если сомневаетесь, смотреть на тесты.

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


/**
 * Extracts a selection of string and return a new string or NULL.
 * It supports both negative and positive indexes.
 */
char *
str_slice(char str[], int slice_from, int slice_to)
{
    // if a string is empty, returns nothing
    if (str[0] == '')
        return NULL;

    char *buffer;
    size_t str_len, buffer_len;

    // for negative indexes "slice_from" must be less "slice_to"
    if (slice_to < 0 && slice_from < slice_to) {
        str_len = strlen(str);

        // if "slice_to" goes beyond permissible limits
        if (abs(slice_to) > str_len - 1)
            return NULL;

        // if "slice_from" goes beyond permissible limits
        if (abs(slice_from) > str_len)
            slice_from = (-1) * str_len;

        buffer_len = slice_to - slice_from;
        str += (str_len + slice_from);

    // for positive indexes "slice_from" must be more "slice_to"
    } else if (slice_from >= 0 && slice_to > slice_from) {
        str_len = strlen(str);

        // if "slice_from" goes beyond permissible limits
        if (slice_from > str_len - 1)
            return NULL;

        buffer_len = slice_to - slice_from;
        str += slice_from;

    // otherwise, returns NULL
    } else
        return NULL;

    buffer = calloc(buffer_len, sizeof(char));
    strncpy(buffer, str, buffer_len);
    return buffer;
}

тесты

#include <assert.h>

void
test_str_slice()
{
    char str[] = "abcdefghijkl";

    assert(NULL == str_slice(str, -3, -10));
    assert(NULL == str_slice(str, -1, -2));
    assert(NULL == str_slice(str, -1, 0));
    assert(NULL == str_slice(str, 1, 0));
    assert(NULL == str_slice(str, 5, 4));
    assert(NULL == str_slice(str, 0, 0));
    assert(NULL == str_slice(str, 10, 10));
    assert(NULL == str_slice(str, -2, -2));
    assert(NULL == str_slice(str, -20, -12));
    assert(NULL == str_slice(str, -20, -13));
    assert(NULL == str_slice(str, 12, 13));
    assert(NULL == str_slice(str, 12, 20));
    assert(NULL == str_slice("", 1, 2));
    assert(NULL == str_slice("", -2, -1));
    assert(strcmp(str_slice(str, -3, -1), "jk") == 0);
    assert(strcmp(str_slice(str, -8, -3), "efghi") == 0);
    assert(strcmp(str_slice(str, -10, -9), "c") == 0);
    assert(strcmp(str_slice(str, -2, -1), "k") == 0);
    assert(strcmp(str_slice(str, -15, -1), "abcdefghijk") == 0);
    assert(strcmp(str_slice(str, -12, -2), "abcdefghij") == 0);
    assert(strcmp(str_slice(str, -15, -8), "abcd") == 0);
    assert(strcmp(str_slice(str, -15, -11), "a") == 0);
    assert(strcmp(str_slice(str, 1, 3), "bc") == 0);
    assert(strcmp(str_slice(str, 11, 100), "l") == 0);
    assert(strcmp(str_slice(str, 2, 4), "cd") == 0);
    assert(strcmp(str_slice(str, 3, 6), "def") == 0);
    assert(strcmp(str_slice(str, 0, 1), "a") == 0);
    assert(strcmp(str_slice(str, 4, 6), "ef") == 0);
    assert(strcmp(str_slice(str, 1, 2), "b") == 0);
    assert(strcmp(str_slice(str, 0, 3), "abc") == 0);
    assert(strcmp(str_slice(str, 0, 11), "abcdefghijk") == 0);
    assert(strcmp(str_slice(str, 2, 10), "cdefghij") == 0);
    assert(strcmp(str_slice(str, 0, 50), "abcdefghijkl") == 0);
}

Как вы можете видеть в тестах, функция возвращает строку или null. Он также имеет поддержку как отрицательных, так и положительных индексов. Эта идея взята из упомянутых ранних особенностей из JavaScript и Python. Итак, не загрязняйте этот ответ большим количеством текста, я рекомендую вам прочитать документы JavaScript и Python.


http://www.cplusplus.com/reference/cstring/

вы можете использовать такие функции, как strstr (для получения подстроки), strtok (разделение с помощью некоторого токена),