Question

Je suis en train de lire le livre K & amp; R et je suis un peu coincé.

Quel est le problème avec ce qui suit?

void getInput(int* output) {
   int c, i;
   for(i=0; (c = getchar()) != '\n'; i++)
     output[i] = c; // printf("%c", c) prints the c value as expected
   output[++i] = '\0';
}

Lorsque je lance le programme, il ne sort jamais de la boucle et je dois Ctrl + C pour quitter. Cependant, si je remplace la cinquième ligne par printf ("% c", c); , toutes les entrées sont imprimées correctement après avoir appuyé sur Entrée et avoir créé la nouvelle ligne.

Était-ce utile?

La solution

  

Quel est le problème avec ce qui suit?

1. void getInput(int* output) {

Pourquoi l'argument d'entrée est-il un int * quand vous voulez stocker dans un tableau de caractères? Probablement

void getInput(char* output) {

est meilleur.

Aussi, comment savez-vous que le pointeur de sortie pointe vers un endroit où vous avez suffisamment de mémoire pour écrire les entrées de l'utilisateur? Vous devez peut-être avoir la longueur maximale de la mémoire tampon en tant que paramètre supplémentaire pour éviter les erreurs de débordement de mémoire tampon, comme a souligné .

5.   output[++i] = '\0';

j’ai déjà été incrémenté d’un temps supplémentaire dans la boucle for, vous pouvez donc simplement faire:

output[i] = '\0';

En dehors de ceux-ci, le programme fonctionne correctement et affiche ce que nous avons entré jusqu'au retour.

FWIW, je l’ai testé en l’appelant ainsi:

 int main(void)
{
    char o[100];
    getInput(o);
    printf("%s", o);
    return 0;
}

Autres conseils

Cela me semble correct, sauf que vous n’avez pas besoin d’incrémenter en dehors de la boucle. Le i est incrémenté juste avant la fin de la boucle, il est donc déjà là où vous le souhaitez.

Assurez-vous qu'un '\ n' est en train de le transformer en c.

Parfois, un '\ n' sera jeté comme un séparateur.

votre dernier code tel que posté contient 3 erreurs que je peux voir:

char* userInput[MAX_INPUT_SIZE];

Devrait être:

char userInput[MAX_INPUT_SIZE+1];

(cela a déjà été mentionné par Pax Diablo)

getInput(&userInput);

Devrait être:

getInput( userInput );

Cette dernière erreur signifie que vous avez passé à getInput une adresse dans votre pile d'appels. vous avez un écrasement de la mémoire. probablement l'un de vos appels à getchar () retourne à la mauvaise adresse.

un moyen simple de risquer un débordement de tampon, car la taille de la sortie n'est jamais passée / vérifiée

Avez-vous essayé d'utiliser un débogueur? Vous devriez parcourir le code dans gdb ou visual studio ou tout ce que vous utilisez et voir ce qui se passe. Vous avez dit que vous étiez un débutant, alors peut-être que vous ne l'aviez pas encore envisagé - c'est une technique de débogage plutôt normale à utiliser.

Voici le programme complet avec quelques mises à jour de votre saisie, mais il ne sera toujours pas sorti de la boucle. BTW c'était l'exercice 1-24 à la page 34

#include <stdio.h>

#define STACK_SIZE 50
#define MAX_INPUT_SIZE 1000
#define FALSE 0
#define TRUE 1

void getInput();
int validInput();

int main() {
  char* userInput[MAX_INPUT_SIZE];

  getInput(&userInput);

  if (validInput(&userInput) == TRUE)
    printf("Compile complete");
  else
    printf("Error");
}

// Functions
void getInput(char* output) {
  int c, i;
  for(i=0; (c = getchar()) != '\n' && c != EOF && i <= MAX_INPUT_SIZE; i++)
    output[i] = c;
  output[i] = '\0';
}

int validInput(char* input) {
  char stack[STACK_SIZE];
  int c;
  int j;

  for (j=0; (c = input[j]) != '\0'; ) {
    switch(c){
      case '[': case '(': case '{':
        stack[j++] = c;
        break;
      case ']': case ')': case '}':
        if (c == ']' && stack[j] != '[')
          return FALSE;
        else if (c == '}' && stack[j] != '{')
          return FALSE;
        else if (c == ')' && stack[j] != '(')
          return FALSE;

        // decrement the stack's index  
        --j;
        break;
    }
  }

  return TRUE;
}

Voici le code de travail final. Je dois dire que je me suis pas mal tiré de celui-ci. Merci de votre aide et de vos conseils.

Avez-vous des suggestions pour améliorer les choses?

#include <stdio.h>

#define STACK_SIZE 50
#define MAX_INPUT_SIZE 1000
#define FALSE 0
#define TRUE !FALSE

void get_input();
int valid_input();

int main() {
  char user_input[MAX_INPUT_SIZE + 1]; // +1 for the \0

  get_input(user_input);

  if (valid_input(user_input))
    printf("Success\n");
  else
    printf("Error\n");
}

// Functions
void get_input(char* output) {
  int c, i;
  for(i=0; (c = getchar()) != '\n' && c != EOF && i <= MAX_INPUT_SIZE; i++)
    output[i] = c;
  output[i] = '\0';
}

int valid_input(char* input) {
  char stack[STACK_SIZE];
  char c;
  int i = 0;
  int stack_index = -1;

  while ((c = input[i]) != '\0' && i < STACK_SIZE) {
    switch(c){
      case '[': case '(': case '{':
        stack_index++; 
        stack[stack_index] = c;
        break;
      case ']': case ')': case '}':
        if ((c == ']' && stack[stack_index] != '[') ||
            (c == '}' && stack[stack_index] != '{') ||
            (c == ')' && stack[stack_index] != '('))
          return FALSE;

        // decrement the stack's index now that the closing bracket is found  
        stack_index--;
        break;
    }
    i++;
  }

  // stack index should be back where it started
  return (stack_index == -1);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top