0
votes

Comment puis-je modifier une apostrophe en une seule unité au lieu de 3 octets? (\ 342 \ 200 \ 231) en utilisant c

Espérons que quelqu'un peut m'aider ici. J'essaie de créer un programme qui compte le nombre de mots, de voyelles, de caractères spéciaux, etc. Après avoir fait des creuser, j'ai réalisé que les valeurs étant stockées pour une seule apostrophe comptent pour 3 positions où il ne faut en être qu'un. Si quelqu'un sait comment résoudre ce problème, je l'apprécierais grandement! Merci !!

for (int i = 0; sentence[i] != '\0'; ++i) {
    if (sentence[i] == 'a' || sentence[i] == 'e' || sentence[i] == 'i' || sentence[i] == 'o' || sentence[i] == 'u'||
        sentence[i] == 'A' || sentence[i] == 'E' || sentence[i] == 'I' || sentence[i] == 'O' || sentence[i] == 'U') {
        ++numVowels;
    } else if (sentence[i] == ' ') {
        ++numSpaces;
    } else {
        ++numSpecials;
        printf("%c\n",sentence[i]);
    }

    if ((sentence[i] == ' ' && sentence[i+1] != ' ') || (sentence[i] != '\0' && sentence[i+1] == '\0')) {
        ++numWords;
    }
}

printf("Number of words: %d\n", numWords);
printf("Number of spaces: %d\n", numSpaces);
printf("Number of vowels: %d\n", numVowels);
printf("Number of consonants and special characters: %d\n", (numSpecials));


2 commentaires

Si vous avez besoin de gérer UNICODE, envisagez de convertir en UTF-32 d'abord. Utilisez une bibliothèque Unicode pour le faire. Vous pouvez également convertir en latin1 par exemple, ignorer les caractères qui n'existent pas en latin1, mais toujours, utilisez une bibliothèque. 7 bits Conversion ASCII que vous pourriez faire à la main sensiblement, je suppose.


VTC en tant qu'étraction de faute de frappe - Fait intéressant une erreur de typo dans la saisie de données.


3 Réponses :



4
votes

\ 342 \ 200 \ 231 est E2 80 99 en hex, qui est le UTF-8 forme codée de U + 2019 Bonne cotation unique qui est pas une apostrophe. C'est l'un des citations intelligentes in Unicode

UTF-8 est un codage de largeur variable, vous devez donc ignorer le point de code complet (qui peut être codé par plusieurs octets). C'est simple à faire une fois que vous avez appris la règle de codage de UTF-8 (moins les choses durs comme la séquence la plus courte ou la vérification de séquence non valide ...)

Cependant, puisque vous voulez compter mots, voyelles, caractères spéciaux qui est trop large. Comment compteriez-vous des personnages tels que á, è, ü ...? Que sont considérés comme des caractères spéciaux? Il existe des dizaines de milliers de chacun d'eux et vous ne pourrez pas travailler sur une solution générale sans aucune bibliothèque externe

Si vous voulez juste faire cela comme un exercice, envisagez de limiter l'entrée à ASCII uniquement


1 commentaires

Merci pour votre aide, j'ai compris ce qui se passait.



1
votes

Bienvenue à la programmation Unicode. Ce que vous avez, il existe une "bonne guillemande unique", éventuellement d'une sorte d'éditeur de documents Word car ils remplaceront couramment ", ', etc. avec le plus spécifique basé sur le contexte.

Si vous avez besoin de traiter avec Unicode, vous voudrez probablement utiliser une bibliothèque Unicode ou les données de l'unicode.org Communiqués . Lors de la décodage UTF-8 elle-même est facile, des questions telles que "est-ce une marque de ponctuation?", "Est-ce un espace?", "Est-ce une partie d'une lettre?" etc. ne sont pas.

Les données spécifiques que vous souhaitez obtenir, je crois que la "catégorie de caractères unicode". La majeure partie des catégories étant:

  • lettre
  • Mark ( Combinaison de caractères , etc.) < / li>
  • NUMÉRO
  • ponctuation
  • Symbole
  • sépérateur (espaces, paragraphe, etc.)
  • Autre (codes de contrôle, etc.)

    Il y a aussi de nombreuses sous-catégories, bien que je ne pense pas que vous en ayez besoin. http://www.fileformat.info/info/unicode/category/index. HTM semble avoir une liste de jolie à rechercher en ligne.

    La principale caractéristique du problème est probablement le nombre de «voyelles» comme cela ne se traduit pas correctement à toutes les langues / scripts. Potentiellement, vous pourriez "décomposer" des choses comme á et ne compter que les lettres AEIOU résultantes à votre usage.


0 commentaires