La chaîne a un contenu même s’il n’y a aucune entrée de l’utilisateur

J’essaie de “piéger” les entrées au clavier de l’utilisateur, ce qui signifie que le code les empêchera de saisir certains caractères, ce qui dans ce cas empêche l’entrée de chiffres et de caractères spéciaux.

#include  #include  #include  #include  #include  char buffer[30]; void in_text(); int main(void) { in_text(); printf ("\nThe ssortingng you entered is: %s", buffer); return 0; } void in_text(void) { char buffe[30]; char c1; int x = 0, hit = 0; printf("Enter ssortingng: "); while (hit!=1) { c1 = getch(); if (c1=='\b' && x!=0) { buffe[--x] = '\0'; printf ("\b \b"); } if (isalpha(c1) || isspace(c1) && c1!='\r') { buffe[x++] = c1; buffe[x+1] = '\0'; printf("%c", c1); } if (c1=='\r' && strlen(buffe)==0) { buffe[x+1] = '\0'; } else if (c1=='\r' && strlen(buffe)>1) { printf ("%d", strlen(buffe)); printf ("\n%s", buffe); hit = 1; } else{ } } strcpy(buffer, buffe); return 1; } 

Ce code tente de reproduire le style de saisie scanf que l’on peut voir et appuie sur la touche retour arrière pour supprimer un caractère saisi précédemment. Je veux “intercepter” la touche Entrée de telle sorte que lorsque l’utilisateur appuie sur “Entrée”, le programme vérifie si la chaîne actuelle (buffe) contient au moins un caractère valide et que lorsque le programme vérifie les entrées et découvre que l’utilisateur a appuyé la touche Entrée et la chaîne ne contient rien, la boucle continue.

Le problème avec mon code est que, lorsque j’appuie sur Entrée, immédiatement après le démarrage du programme, la fonction strlen renvoie une valeur supérieure à 0, ce qui, je suppose, n’est pas normal, car il n’y a pas encore d’entrée de l’utilisateur, à part “Entrer “touche sur laquelle l’utilisateur a appuyé.

Des idées à ce sujet?

Lire des variables non initialisées comme fait pour buffe ici en buffe :

 if (c1=='\r' && strlen(buffe)==0) 

provoque un comportement indéfini, tout peut arriver après. Ne faites pas cela.

Toujours initialiser les variables avant de les lire.

Dans ce cas, vous voudrez peut-être simplement faire:

 char buffe[32] = ""; 

ou (comme déjà proposé par d’autres) la manière plus générique:

 char buffer[32] = {0}; 

Plus compliqué mais également valable serait de faire:

 char buffer[32]; strcpy(buffe, ""); 

ou

 char buffer[32]; memset(buffe, 0, sizeof(buffe)); 

Peut être essayer

 char buffe[30] = {0}; 

(Je n’ai pas essayé cette thouggh)

La mémoire contient toujours quelque chose. L’espace utilisé par votre variable contient quelque chose et l’appel de strlen () à ce moment-là ne se fait pas exploser quelque part.

Notez que le système d’exploitation lit généralement une ligne complète (et permet de l’éditer) et l’envoie à l’application de lecture uniquement en entrée. La gérer est beaucoup plus difficile que la simple lecture. Etes-vous sûr que ce n’est pas assez bon pour obtenir une ligne, vérifier et se plaindre ou aller de l’avant?

puisque votre buffe obtiendra de la mémoire sur la stack, il contiendra une valeur erronée. Vous feriez mieux de l’initialiser avec zéro ou d’utiliser la fonction memset ().