5 votes

C Supprimer le dernier caractère de la chaîne

Je veux effacer le dernier caractère d'une chaîne de caractères j'utilise d'abord la fonction strtok Mon entrée est : "Hello World Yaho" J'utilise " " comme mon délimiteur

Mes attentes sont les suivantes

Hell
Worl
Yah

Mais la sortie réelle est la suivante

Hello
Worl
Yaho

Comment puis-je résoudre ce problème ? Je ne comprends pas ce résultat

Voici mon code

int main(int argc, char*argv[])
{
   char *string;
   char *ptr;
   string = (char*)malloc(100);

   puts("Input a String");
   fgets(string,100,stdin);

   printf("Before calling a function: %s]n", string);

   ptr = strtok(string," ");

   printf("%s\n", ptr);

   while(ptr=strtok(NULL, " "))
   {
      ptr[strlen(ptr)-1]=0;
      printf("%s\n", ptr);
   }

   return 0;
}

4voto

909 Niklas Points 5350

Ce programme supprime le dernier caractère de chaque mot.

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

int main(int argc, char*argv[]){

    char *string;
    char *ptr;
    string = (char*)malloc(100);
    puts("Input a String");
    fgets(string,100,stdin);
    printf("Before calling a function: %s\n", string);
    string[strlen(string)-1]=0;
    ptr = strtok(string," ");
    printf("%s\n", ptr);
    while(ptr){
        ptr[strlen(ptr)-1]=0;
        printf("%s\n", ptr);
        ptr = strtok(0, " ");
    }
    return 0;
}

Vous devez vous rappeler de

  1. Découper la chaîne de caractères de la nouvelle ligne de fin
  2. Utiliser correctement strtok

Test

Input a String
Hello World Yaho
Before calling a function: Hello World Yaho

Hello
Hell
Worl
Yah

1voto

chqrlie Points 17105

La meilleure façon de résoudre votre problème est de le diviser en deux phases : d'une part, l'analyse de la phrase en mots et, d'autre part, l'analyse de la phrase en mots. strtok si vous le souhaitez, et l'impression des mots avec le dernier caractère omis dans une fonction séparée :

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

static void print_truncated_word(const char *ptr) {
    int len = strlen(ptr);
    if (len > 0) len -= 1;
    printf("%.*s", len, ptr);
}

int main(int argc, char*argv[]) {
    char buf[128];
    char *ptr;

    puts("Input a string: ");
    if (fgets(buf, sizeof buf, stdin) == NULL) {
        /* premature end of file */
        exit(1);
    }
    printf("Before calling a function: %s\n", string);

    ptr = strtok(string, " \n");
    while (ptr) {
        print_truncated_word(ptr);
        ptr = strtok(NULL, " \n");
    }
    return 0;
}

Il convient de noter que le print_truncated_word ne modifie pas la mémoire tampon. Les effets secondaires sur les arguments d'entrée doivent être évités, à moins qu'ils ne constituent l'objectif explicite de la fonction. strtok se comporte mal à cet égard, parmi d'autres défauts tels que son état caché qui empêche l'utilisation imbriquée.

0voto

Ronak Khandelwal Points 160

Puisque vous avez conservé le delm comme espace, il créera des tokens séparés pour les mots séparés par des espaces dans votre chaîne et les chaînes de style c contiennent leurs derniers caractères comme '. \0 ', c'est-à-dire le caractère nul, de sorte qu'il supprime ce caractère et non le dernier caractère du texte.

à vérifier http://www.cprogramming.com/tutorial/c/lesson9.html

il s'avère que les chaînes de style C sont toujours terminées par un caractère nul, littéralement un '. \0 (avec la valeur 0),

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X