Pregunta

Estoy leyendo el libro K & amp; R, y estoy un poco atascado.

¿Qué está mal con lo siguiente?

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';
}

Cuando ejecuto el programa nunca se sale del bucle y tengo que Ctrl + C para salir. Sin embargo, si sustituyo la quinta línea con printf ("% c " ;, c); , imprime todas las entradas justo después de pulsar Intro y creando la nueva línea.

¿Fue útil?

Solución

  

¿Qué está mal con lo siguiente?

1. void getInput(int* output) {

¿Por qué el argumento de entrada es un int * cuando lo que desea almacenar en una matriz de caracteres? Probablemente

void getInput(char* output) {

es mejor

Además, ¿cómo sabes que el puntero de salida está apuntando a algún lugar donde tienes suficiente memoria para escribir la entrada del usuario? Tal vez debe tener la longitud máxima del búfer como parámetro adicional para evitar errores de desbordamiento del búfer como PW señalado .

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

Ya he incrementado un tiempo adicional dentro del bucle for, así que puedes hacerlo:

output[i] = '\0';

Aparte de estos, el programa funciona bien y genera lo que ingresamos hasta que regresamos.

FWIW, lo probé llamándolo así:

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

Otros consejos

Me parece correcto, tal como está escrito, excepto que no es necesario que aumente i fuera del bucle. La i se incrementa justo antes de que salga el bucle, por lo que ya está donde lo desea.

Asegúrate de que un '\ n' esté convirtiéndolo en c.

A veces, un '\ n' se desecha como un delimitador.

su último código publicado tiene 3 errores que puedo ver:

char* userInput[MAX_INPUT_SIZE];

Debería ser:

char userInput[MAX_INPUT_SIZE+1];

(esto ya fue mencionado por Pax Diablo)

getInput(&userInput);

Debería ser:

getInput( userInput );

Este último error significa que pasó para obtener una dirección dentro de su pila de llamadas. Usted tiene una sobrescritura de memoria. probablemente una de tus llamadas a getchar () vuelve a la dirección incorrecta.

una forma sencilla de arriesgar el desbordamiento del búfer, porque el tamaño de la salida nunca se pasa / verifica

¿Has intentado usar un depurador? Debe pasar por el código en gdb o visual studio o lo que esté usando y ver qué está pasando. Dijiste que eras un principiante, así que tal vez aún no lo habías considerado, esta es una técnica de depuración bastante normal para usar.

Aquí está el programa completo con un par de actualizaciones de su entrada, pero aún así no saldrá del ciclo. Por cierto, este fue el ejercicio 1-24 en la página 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;
}

Aquí está el código de trabajo final. Debo decir que aprendí bastante de hacer esto. Gracias por la ayuda y los punteros.

¿Alguna sugerencia sobre cómo podrían hacerse mejor las cosas?

#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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top