2010-02-05 14 views
2

J'écris un programme qui déchiffre des phrases, des syllabes et des mots donnés dans un fichier texte de base.Reconnaître les espaces dans le texte

Le programme parcourt le fichier caractère par caractère. Il regarde d'abord s'il s'agit d'une sorte de marqueur de fin de phrase, comme !?:; ou .. Ensuite, si le caractère n'est pas un espace ou une tabulation, il suppose qu'il s'agit d'un caractère. Enfin, il identifie que s'il s'agit d'un espace ou d'une tabulation, et que le dernier caractère avant qu'il ne s'agisse d'une lettre/caractère valide (par exemple, pas un marqueur de fin de phrase), c'est un mot. J'ai été un peu léger sur les détails, mais voici le problème que j'ai. Mon nombre de mots est égal à mon nombre de phrases. Ce à quoi il interprète, c'est qu'il se rend compte qu'un mot s'arrête quand il y a un marqueur de fin de phrase, MAIS le vrai problème est que les espaces sont considérés comme des lettres valides.

Heres mon instruction if, de décider si le personnage en question est une lettre valide en un mot:

else if(character != ' ' || character != '\t') 

Je l'ai déjà Exclue des marqueurs de fin de phrase par ce point dans le programme. (Dans l'original si effectivement). En lisant une table Ascii, 32 devrait être le caractère d'espace. Cependant, quand je produis tous les caractères qui le font dans ce bloc de code, les espaces sont dedans.

Alors qu'est-ce que je fais mal? Comment puis-je empêcher les espaces de passer à travers ce si? Merci d'avance, et j'ai le sentiment que la question peut être un peu vague ou mal formulée. Si vous avez des questions ou besoin d'éclaircissements, faites le moi savoir.

+2

Yikes! Utilisez des littéraux de caractères, mec! Il n'y a aucun intérêt à vous rendre le code * deux * plus difficile à lire et le jeu de caractères dépendant. Comme ceci 'character! = ''' ... Et utilisez ''\ t'' pour l'onglet. – dmckee

Répondre

4

Je note que

(character != 32 || character != 9) 

est toujours vrai. parce que si le caractère est de 32 il est 9 et vrai ou faux est vrai ...

Vous voulez dire probablement

(character != ' ' && character != '\t') 
+0

le && au lieu de || résolu mon problème, le programme procède maintenant comme il le devrait. J'ai un autre problème cependant, et vous pouvez voir le montage sur le post original pour plus de détails – Blackbinary

+0

oups double post – Blackbinary

+0

Pourquoi la distribution à 'int'? –

0

Il serait sans doute préférable de comparer seulement contre les personnages spécifiques que vous considérez comme des espaces, utilisez également un & &:

if ((character != ' ') && 
    (character != '\t')) 
+0

Oui, je sais que c'est un moyen valable. J'ai essayé cela avant l'inverse. Mais peu importe comment je le dis pour éviter les caractères qui sont des espaces ou des tabulations, ce n'est pas le cas. – Blackbinary

+0

@Blackbinary: Parce que vous vérifiez la mauvaise chose: vous pouvez faire: 'if (c! = '' && c! = '\ T')' etc, et cela fonctionnerait. –

+0

Je suis d'accord avec Alok, je n'ai pas pensé au code mais chaque caractère sera toujours! = '' OR! = '\ T'. Je vais mettre à jour mon code, n'a pas attrapé ce problème –

8

Vous ne devez pas compter sur des chiffres réels pour les caractères: qui dépend de l'encodage de votre utilise la plate-forme et ne peut pas être ASCII. Vous pouvez vérifier n'importe quel personnage en le testant simplement. Par exemple, pour tester si c est un espace:

if (c == ' ') 

fonctionnera, est plus facile à lire, et est portable.

Si vous voulez sauter tout l'espace blanc, vous devez utiliser #include <ctype.h> puis utilisez isspace():

if (isspace((unsigned char)c)) 

Modifier: Comme d'autres ont dit, votre condition pour vérifier « pas un espace » est erroné , mais le point ci-dessus s'applique toujours.Ainsi, votre condition peut être remplacée par:

if (!isspace((unsigned char)c)) 
+0

Je pensais que plus de code pourrait être nécessaire. Tenez-vous bien et j'essaierai quelques trucs qui ont été suggérés (principalement le && au lieu de ||) – Blackbinary

+0

@Blackbinary: s'il vous plaît voir mon edit: vous n'aurez probablement pas besoin de plus de code, mais vous devriez remplacer votre condition par 'if (! isspace (...)) 'de toute façon. –

+0

yay pour utiliser la bibliothèque appropriée! – rampion