Vérifier si un personnage est un espace

Je crée un programme en C absurdement simple pour déconner avec getchar() . Le programme imprimera ce que vous avez entré jusqu’à ce que vous appuyiez sur Entrée et garantira que vos lignes ne contiennent pas plus de 80 caractères. Pour ce faire, je compte le nombre de caractères saisis. Une fois que le nombre de caractères atteint 70, le prochain espace rencontré provoquera un saut de ligne. Si aucun espace n’est rencontré entre 70 et 80, un saut de ligne se produira quand même. Je réalise que cette implémentation est super naïve et pourrait être optimisée à gauche et à droite, mais souvenez-vous, je déconne:

 while ((c = getchar()) != '\n') { if (lineLengthCount < 70) { putchar(c); lineLengthCount++; } else if (lineLengthCount < 80 && (c == ' ')) { printf("%c\n", c); lineLengthCount = 0; } else { printf("%c\n", c); lineLengthCount = 0; } } 

Le problème est que le conditionnel c == ' ' ne semble pas rechercher réellement un espace. Je reçois une sortie comme ceci:

 fitter happier more productive comfortable not drinking too much regula r exercise at the gym three days a week getting on better with your ass ociate employee contemporaries at ease eating well no microwaved dinner 

où j’espérais que les lignes seraient tronquées quand un espace a été rencontré. Quel que soit le caractère entré après la ligne 70, une nouvelle ligne est créée. est-ce que je manque quelque chose? Est-ce que ' ' signifie vraiment n’importe quel personnage?

 while ((c = getchar()) != '\n') { if (lineLengthCount < 70) { putchar(c); lineLengthCount++; } else if (lineLengthCount < 80 && (c == ' ')) { printf("%c\n", c); lineLengthCount = 0; } else if (lineLengthCount >= 80){ printf("%c\n", c); lineLengthCount = 0; } else{ putchar(c); lineLengthCount++; } } 

Je pense que cela devrait fonctionner. Cela devrait empêcher le rest de s’exécuter s’il ya moins de 80 caractères mais qu’il ne s’agit pas d’un espace.

EDIT: Je me suis rendu compte maintenant que si lineLengthCount est inférieur à 80 mais que le caractère n’est pas un espace, il ne sera pas imprimé du tout. J’en ai ajouté un autre à la fin pour le corriger.

Ne serait-ce pas plus court et plus concis?

 while ((c = getchar()) != '\n') { putchar(c); if((c == ' ' && lineLengthCount >= 70) || lineLengthCount >= 80){ printf("\n"); lineLengthCount = 0; } else ++lineLengthCount; } 

Il y a un problème avec vos conditions: si lineLengthCount est> 70 mais que le caractère suivant n’est pas un espace, la dernière else sera frappée, coupant la ligne et réinitialisant le compteur.

Si vous n’êtes pas du tout sûr de ce qui se passe, je vous recommanderais de scinder le “si” conditionnel en trois vérifications explicites:

 while ((c = getchar()) != '\n') { lineLengthCount++; if (lineLengthCount < 70) { putchar(c); } if (lineLengthCount < 80 && (c == ' ')) { printf("%c\n", c); lineLengthCount = 0; } if (lineLengthCount == 80) { printf("%c\n", c); lineLengthCount = 0; } } 

Si vous voulez voir ce qui se passe, écrivez une sortie de débogage dans chaque "if" pour remarquer quand il est appelé.

Une fois que cela fonctionne et que vous comprenez pourquoi, vous pouvez le modifier et combiner les "if" ...

L’utilisation de ” est complètement valide. Vous pouvez également essayer d’utiliser la fonction de bibliothèque standard C isspace () pour vérifier si le caractère est un espace. Cette fonction retourne une expression booléenne, comme dans:

 char ch = '0'; if (isspace(ch)) //the char is a space... 

Par “est un espace”, cette fonction signifie en réalité tout caractère “espace”, ce qui inclut “\ n” ou tout autre caractère qui s’imprime sous forme d’espace vide.

Vous pouvez également utiliser la valeur décimale 32, ce qui signifie la même chose qu’un espace:

 if (ch==32) 

Cependant pour des raisons de lisibilité, je préférerais utiliser la première version!