La tâche consiste donc à transformer chaque mot de la phrase commençant par une majuscule en "***".

"

for (i = 1; input[i] != '\0'; i++)
    if(isupper(input[i]))   input[i] = '***';

printf("\n Changed sentence is:     %s", input);

"

C'est un code que j'ai écrit jusqu'à présent. Cela ne peut changer qu'un seul caractère mais je ne sais pas comment le faire avec le mot entier.

0
Elgernon 20 nov. 2018 à 22:31

5 réponses

Meilleure réponse

Voici une solution potentielle:

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

int main(void)
{
    char input[] = "The Mississippi river is very Wide.";

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

    for(int i = 0; i < strlen(input); i++)
    {
        if((i != 0) && isupper(input[i]))
        {
            printf("*** ");
            while(input[i] != ' ')
                i++;
        }
        else
        {
            printf("%c", input[i]);
        }
    }

    if(ispunct(input[strlen(input) - 1]))
        printf("\b%c\n", input[strlen(input) - 1]);
    else
        printf("\n");

    return 0;
}

Sortie

$ gcc main.c -o main.exe; ./main.exe
The Mississippi river is very Wide.
The *** river is very ***.
1
Fiddling Bits 20 nov. 2018 à 20:29

Je suppose que input est une chaîne C correctement allouée et terminée par null.


Vous scannez (dans la boucle) un caractère à la fois; de même, vous pouvez changer un caractère à la fois.

Vous avez donc besoin d'une variable supplémentaire dans laquelle vous stockez si le mot analysé doit être converti en une séquence d'astérisques.

Lorsque vous rencontrez une lettre majuscule au début d'un mot, la variable est définie sur true.

Lorsque vous rencontrez la fin du mot actuel (un espace), vous réinitialisez la variable à false.

Enfin, vous modifiez (ou non) le caractère actuel en conséquence.

Voir les commentaires dans le code

// you need a variable to record if the current word
// should be converted to a sequence of '*'
bool toAsterisk = false;

// sentence scanning loop (one character at a time)
// note that index starts at 0 (not 1)
for (i = 0; input[i] != '\0'; i++)
{
    // check if the current word should be converted to asterisks
    if( isupper( input[i] ) && toAsterisk == false )
    {
        toAsterisk = true;
    }

    // check if you rwach the end of the current word
    if( input[i] == ' ' )
    {
        toAsterisk = true;
    }

    // convert to asterisks?
    if( toAsterisk )
    {
        input[ i ] = '*';
    }
}
2
Paolo 20 nov. 2018 à 19:58

En changeant un caractère en trois (vous les changez en trois étoiles), vous changez la longueur de la chaîne. Essayez de partir de là. [Ce problème peut affecter le fonctionnement de la boucle]

-1
Krzychu111 20 nov. 2018 à 19:36

Eh bien, suite aux commentaires vus dans les commentaires, voici ma version qui ne dépend pas de la longueur de la ligne d'entrée ou de la mémoire disponible pour le programme. Il implémente un automate à états finis, trois états, pour détecter la première lettre, les lettres suivantes et les lettres non-mot. Suite à une implémentation possible:

#include <stdio.h>
#include <ctype.h>

#define IDLE    (0)
#define FIRST   (1)
#define NEXT    (2)

int main()
{
    int status = IDLE;
    int c;
    while ((c = getchar()) != EOF) {
        if (isupper(c)) {
            switch (status) {
            case IDLE:
                status = FIRST;
                printf("***");
                break;
            case FIRST: case NEXT:
                status = NEXT;
                break;
            } /* switch */
        } else if (islower(c)) {
            switch (status) {
            case IDLE:
                putchar(c);
                break;
            case FIRST: case NEXT:
                status = NEXT;
            } /* switch */
        } else {
            switch (status) {
            case IDLE:
                putchar(c);
                break;
            case FIRST: case NEXT:
                putchar(c);
                status = IDLE;
                break;
            } /* switch */
        } /* if */
    } /* while */
} /* main */
0
Luis Colorado 22 nov. 2018 à 13:09

Lisez la ligne. Si le caractère est en majuscule, entrez la boucle while jusqu'à ce que vous obteniez un espace ou une fin de ligne et en remplaçant les caractères par *.

Imprimez la ligne.

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

int main()
{
  char line[1024] = "This should Replace capitalized Words!";
  int i = 0;

  printf("line: %s\n", line);

  for (i = 0; i < strlen(line); i++) {
    if (isupper(line[i])) {
      while (line[i] != ' ' && line[i] != '\0' && isalpha(line[i])) {
        line[i] = '*';
        i++;
      }
    }
  }

  printf("line: %s\n", line);
  return 0;
}

Sorties

$ gcc -Wall -Werror test.c -o t
line: This should Replace capitalized Words!
line: **** should ******* capitalized *****!
1
Tormund Giantsbane 20 nov. 2018 à 19:54