Pergunta

Estou lendo sobre o K & livro R, e estou um pouco preso.

O que está errado com o seguinte?

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

Quando eu executar o programa ele nunca fica fora do circuito e eu tenho que Ctrl + C para sair. No entanto, se eu substituir a quinta linha com printf("%c", c);, ele imprime todas as entradas muito bem depois de bater entrar e criar a nova linha.

Foi útil?

Solução

O que está errado com o seguinte?

1. void getInput(int* output) {

Por que o argumento de entrada um int * quando o que você deseja armazenar em uma matriz de caracteres? Provavelmente

void getInput(char* output) {

é melhor.

Além disso, como você sabe que o ponteiro de saída está apontando em algum lugar onde você mantenha memória suficiente para gravar a entrada do usuário? Talvez você deve ter o tamanho do buffer máximo como um parâmetro extra para erros de estouro de buffer evitar, PW apontou .

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

i já foi incrementado um tempo extra dentro do loop for, então você pode apenas fazer:

output[i] = '\0';

Para além destas, o programa funciona muito bem e saídas que nós de entrada até o retorno.

FWIW, eu testei-lo chamando-o assim:

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

Outras dicas

Parece correto para mim como está escrito, exceto que você não precisa incrementar i fora do loop. O i é incrementado logo antes de o loop termina, assim, já é onde você quiser.

Certifique-se de que uma '\ n' está realmente fazendo-o em c.

Às vezes, um '\ n' vai ficar jogado fora como um delimitador.

o seu último código conforme publicado tem 3 erros que eu posso ver:

char* userInput[MAX_INPUT_SIZE];

Deve ser:

char userInput[MAX_INPUT_SIZE+1];

(o que já foi mencionado por Pax Diablo)

getInput(&userInput);

Deve ser:

getInput( userInput );

Este último erro significa que você passou para GetInput um endereço dentro de sua pilha de chamadas. você tem uma substituição de memória. provavelmente uma das suas chamadas para getchar () returnes para o endereço errado.

uma maneira simples de buffer overflow risco, porque o tamanho da saída nunca é passado / verificados

Você já tentou usar um depurador? Você deve percorrer o código em gdb ou visual studio ou o que você está usando e ver o que está acontecendo. Você disse que você era um novato, então talvez você não tinha considerado que ainda -. Esta é uma técnica de depuração bastante normal para uso

Aqui está o programa completo com um par de atualização de sua entrada, mas ele ainda não vai fazê-lo fora do loop. BTW este foi o exercício 1-24 na pág 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;
}

Aqui está o código de trabalho final. Devo dizer que me pegou um pouco de fazer este. Obrigado pela ajuda e ponteiros.

Todas as sugestões sobre como as coisas poderia ser feito melhor?

#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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top