web-dev-qa-db-fra.com

Comment couper une partie d'une chaîne en c?

J'essaie de comprendre comment couper une partie d'une chaîne en C. Par exemple, vous avez cette chaîne de caractères "Le chien est mort parce qu'une voiture l'a frappé alors qu'il traversait la route" comment une fonction pourrait-elle faire la phrase "a une voiture l'a frappé en traversant la route "ou" une voiture l'a frappé "

Comment procédez-vous avec la bibliothèque C (ou/et) une fonction personnalisée?

ok je n'ai pas le code principal mais ça va être la structure de cette expérience

#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;
}
8
answerSeeker

La fonction suivante coupe une plage donnée d'un tampon de caractères. La plage est identifiée par son indice de démarrage et sa longueur. Une longueur négative peut être spécifiée pour indiquer la plage allant de l'index de début à la fin de la chaîne.

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

La plage de caractères est découpée en déplaçant tout après la plage, y compris la terminaison '\0' à l'index de départ avec memmove, écrasant ainsi la plage. Le texte de la plage est perdu.

Notez que vous devez passer un tampon de caractères dont le contenu peut être modifié. Ne transmettez pas les littéraux de chaîne stockés dans la mémoire morte.

5
M Oehm

strncpy copiera uniquement jusqu'à n caractères. En option, vous pouvez déplacer un pointeur dans la chaîne et également coller un \0 dans le tableau pour le terminer plus tôt si vous disposez d'une mémoire accessible en écriture.

7
woolstar

Pour un tel problème, il vaut mieux écrire sa propre fonction, cela prendra du temps, mais cela sera payant. Un code d'une fonction str_slice est montré ci-dessous, est très similaire à la fonction de JavaScripts string.slice ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice ) et à la fonction Python pour créer un tranche sur des chaînes ou des tableaux ( https://docs.python.org/3.5/library/functions.html#slice ).

Il est également basé uniquement sur la bibliothèque standard C, il doit donc être multiplateforme et fonctionner avec n'importe quel compilateur. En cas de doute, regardez les tests.

#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] == '\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;
}

Tests

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

Comme vous pouvez le voir dans les tests, la fonction retourne une chaîne ou NULL. Il prend également en charge les indices négatifs et positifs. Cette idée est tirée des premières fonctionnalités mentionnées de JavaScript et Python. Donc, ne polluez pas cette réponse en grande quantité de texte, je vous recommande de lire les docs du JavaScript et du Python.

3
PADYMKO

strstr serait parfait pour vous, si vous connaissez le contenu de la chaîne.

Exemple:

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

pCh aura l'adresse du 'd' dans "dog".

2
Fiddling Bits

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

Vous pouvez utiliser des fonctions comme strstr (pour obtenir la sous-chaîne), strtok (fractionné en utilisant un jeton),

0
Digital_Reality