0
votes

Comment vérifier si la chaîne contient uniquement des chiffres ou mot dans C

Mon professeur nous a donné du code qui écrit une fonction déclarée "INT Catégorisation (Char * Str)" qui accepte une chaîne en tant que paramètre d'entrée et catégorisez la chaîne. La fonction doit renvoyer le numéro de catégorie comme décrit ci-dessous:

Catégorie 1: Si la chaîne contient uniquement des lettres majuscules (par exemple ABCDEF), la fonction doit renvoyer 1. P>

Catégorie 2: Si la chaîne contient uniquement Petites lettres (par exemple ABCDEF), la fonction doit renvoyer 2. P>

Catégorie 3: Si la chaîne contient uniquement des lettres mais aucun autre symbole (par exemple, abcabc), la fonction doit renvoyer 3. p>

Catégorie 4: Si la chaîne ne contient que des chiffres (par exemple 12345), la fonction doit renvoyer 4. P>

Catégorie 5: Si la chaîne contient des lettres et des chiffres mais pas d'autres symboles (par exemple, HELLO123), la fonction devrait renvoyer 5. P>

catégorie 6: sinon, la fonction doit renvoyer 6. P>

J'écris ceci mais ne fonctionne pas p>

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

// Write your categorize function here
int categorize(char *str) {
int x=0;
while(str[x]!= '\0'){
     if((*str>='A'&&*str<='Z')  && (*str>='a'&&*str<='z') && (*str>='0'&&*str<='9'))
    return 5;
    else if((*str>='A'&&*str<='Z') && (*str>='a'&&*str<='z'))
    return 3;
    if((*str>='A') && (*str<='Z'))
    return 1;
    else if((*str>='a')&&(*str<='z'))
    return 2;
    else if((*str>='0')&&(*str<='9'))
    return 4;
    x++;
}
return 6;
}

///////////////////////////////////////
// Test main()
  // DO NOT MODIFY main()
  // or your code will not be evaluated
  int main() {
  char str[100];
  scanf("%s",str);
  int c = categorize(str);
  printf("%d\n",c);
  return 0;
 }
///////////////////////////////////////


0 commentaires

4 Réponses :


-2
votes

Vous semblez avoir un bon départ pour votre projet. Vous capturez une chaîne, puis classez-la.

où vous devez vous améliorer est la logique de catégorisation. Je commencerais par faire chacune de vos catégories dans une fonction. xxx

peut retourner 1 si la chaîne est composée uniquement de lettres majuscules et < Code> 0 sinon. La logique peut ressembler à xxx

Notez que vous ne pouvez retourner que VRAI que si vous avez réussi à vérifier tous les charaters avec le code ci-dessus, car vous avez une boucle sur tous les caractères jusqu'à ce que vous ayez frappé le Null caractère \ 0 .

avec du travail, vous pouvez modifier la boucle ci-dessus pour gérer vos autres cas. Cela rendrait votre logique pour le niveau global de haut niveau. xxx


11 commentaires

Cela scannerait la chaîne plusieurs fois, ce qui n'est pas une bonne pratique. Je recommanderais de numériser la chaîne une fois en comptant le nombre de caractères qui s'intègrent dans chacune des catégories. Je pense aussi que les routines de bibliothèque Isalpha (3) seraient utiles.


@ MPEZ0 si par "Numérisation", vous voulez dire capturer la ligne, non, cela ne ferait que capturer l'onece. Si, par "balayage", vous voulez dire analyser la ligne, oui, il ferait plusieurs passes. Notez que les processeurs sont très rapides par rapport aux disques et IO en général. Une approche simple est donc souvent plus facile à traiter que d'une approche complexe, une passe. Oui, j'aurais pu retourner un bitset de {captial, numérique, minuscule, espace, etc., mais il s'agit d'un nouveau programmeur de C, et des chances sont qu'elles ne feraient pas bien une telle approche avant d'avoir acquis une certaine expérience.


Je vois le caractère arithmétique, je pleure.


@DevSolar je suis d'accord, ce n'est même pas proche de UTF (rien) conforme. Mais, lors de l'apprentissage de C, comme cela fait cette personne, UTF doit faire une rétroaction jusqu'à ce que la personne apprenne la langue.


EBCDIC existe, de même que les caractères non-ASCII-7. "Ö" est minuscule, de même que "ß" ou "Å".


@DevSolar Pensez-vous vraiment qu'une personne qui est dans une classe, apprendre C, va écrire des programmes portables C conçus pour travailler sur des systèmes IBM 360? Les chances sont simplement introduites à ASCII à ce stade.


@Edwinbuck Oui, je voulais dire plusieurs passes. Je comprends le statut de programmeur novice de l'OP et accepte qu'il existe une grande zone grise sur "ce qui est plus facile à comprendre pour OP". Je répète mon commentaire Isalpha (3), comme je pense que cela serait plus facile pour OP - ou quiconque - à comprendre, même avec plusieurs passes. Merci également d'avoir pris le temps d'écrire votre réponse et même de répondre à certains de ces commentaires.


Oui, je Vraiment Pensez qu'une personne dans une classe doit écrire du code qui utilise la fonctionnalité standard existante dans la mesure du possible, au lieu de supposer que tout le monde est ASCII-7 et qui devoir renaître plus tard. ISO-8859 n'est pas génial, mais c'est mieux que les arithmétiques ASCII-7 ASCII-7.


@DevSolar Eh bien, une fois que vous leur donnez l'exécution sur UTF, y compris les codages couvrant EBCDIC, UTF-8, UTF-16, etc., vous pouvez alors les introduire aux fonctions et au passage des paramètres. Ou, puisque vous n'êtes pas leur professeur, vous pouvez plier vos opinions dans ce que leur classe demande.


En aucun cas, il a déclaré que la bibliothèque standard est hors limites ou que supposer ASCII-7 était correcte. Pour tout ce que vous et je sais, cette classe est pas Demander cela. Cette hypothèse a été faite dans deux réponses ici simplement basée sur une mauvaise habitude déjà existante par l'OP.


@Devsolar ouais, je ne sais pas pourquoi aucun des commentaires a été supprimé non plus. Je ne les ai certainement pas supprimés. Cela dit, je suis plutôt correct avec le discours civil, le point principal étant, je suis tout pour Portable C, et je suis d'accord avec votre approche de la fabrication de programmes C plus portable; Cependant, je pense que c'est le mauvais public. Une personne "juste apprendre c" peut bénéficier de la forme savoir comment écrire C de manière portable; Mais, s'ils ne savent pas quelle "mode portable" signifie, ils manquent d'autres leçons, tout aussi précieux. Aucun sentiment difficile, et si vous voulez que OT me considère comme un "ce que j'ai dit", le fais-tu, tu veux que tu souhaites.



1
votes

* str Il s'agit d'un pointeur sur le premier caractère de la chaîne, ce qui le long de votre cycle ne vérifie que ce premier caractère.

En outre, vous retournez des valeurs avant de vérifier la chaîne entière, vous avez besoin Pour utiliser des drapeaux et les définir le long du cycle pour les chiffres de chiffres et les petites lettres, et à la fin, renvoyez les valeurs selon ces drapeaux.

Il y a le Bibliothèque qui a des fonctions telles que isalpha et isdigit et peut rendre votre travail plus facile, car je vous réfère à @ DevSolar Réponse comme une meilleure méthode.

Si vous ne pouvez pas l'utiliser, c'est la voie à suivre:

Démo en direct xxx

Notez que ce type d'arithmétique de caractère fonctionne bien dans ASCII mais échoue dans d'autres codages de caractères tels que EBCDIC n'a pas d'ordre séquentiel pour les caractères alphabétiques.


9 commentaires

Je vois le caractère arithmétique, je pleure.


@DevSolar, c'est une mission, il est probable que l'OP ne puisse pas utiliser les fonctions de la bibliothèque.


Mis à part de moi, refusant de manière inverse d'accepter une limitation de ce Braindead lorsque l'instructeur devrait en réalité Enseigner et Encourager Utilisation de la bibliothèque standard, > = 'A' / <= 'z' n'est pas bien formé aussi loin que la norme de langue est concernée même avant le jeu de caractères non basique entre en jeu (car EBCDIC existe). Et op est en utilisant et , donc ... ne commençons pas à supposer Les environnements hawstrung mais présentent le mieux que nous puissions.


@Devsolar, j'ai eu de nombreuses questions, y compris aux examens, en utilisant des personnages arithmétiques, le but est d'enseigner la manière dont cela est fait, j'ai ajouté une responsabilité de non-responsabilité pour clarifier le problème de codage.


Eh bien, c'est exactement là que je suis en désaccord (plutôt fortement). Le caractère arithmétique de caractère devrait jamais être fait, il ne faut tout simplement pas être enseigné, car c'est faux même dans le plus simple des cas, dit mon ami José.


@Devsolar, je suis d'accord avec vous en principe, mais ce n'est pas le point, je ne peux pas parler à l'enseignant un essai de le convaincre de ne pas l'utiliser. Je peux cependant dire à l'OP quels sont les défauts et les contraintes de la méthode utilisée.


Je ne vois aucune mention de contraintes imposées par l'enseignant, je viens de voir des pratiques de codage dans l'exemple et cette réponse pouvant être améliorée.


@DevSolar, qui peut être et je fais référence à l'utilisation de CTYPE.H si possible, l'OP utilise le caractère arithmétique de caractère pour une raison, je doute qu'il ne sache pas ces fonctions.


Rétracté le bowvote pour cela. Bien que je pense toujours qu'il soit malheureux que "ASCII" soit mentionné dans la manière de "ce que la plupart des gens utilisent", lorsque nous utilisons réellement (même si nous n'allons pas complètes Unicode), c'est ISO-8859-15, CP-1252 ou Similaire, pour lequel la gamme AZ ne parvient pas également à raconter toute la vérité.