Frage

Ich lese über das K & R Buch und bin ein wenig hängen.

Was ist los mit dem folgenden?

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

Wenn ich das Programm ausführen es nie aus der Schleife bekommt und ich muß Strg + C verlassen. Allerdings, wenn ich die fünfte Zeile mit printf("%c", c); ersetzen, es druckt alle Eingaben in Ordnung nach der Kollision mit eingeben und die neue Linie zu schaffen.

War es hilfreich?

Lösung

  

Was ist los mit dem folgenden?

1. void getInput(int* output) {

Warum ist das Eingabeargument eines int * wenn das, was Sie in einer Reihe von Zeichen speichern? Wahrscheinlich

void getInput(char* output) {

ist besser.

Auch, wie Sie wissen, dass der Ausgabezeiger zeigt irgendwo, wo man genügend Speicher hält die Eingabe des Benutzers zu schreiben? Vielleicht müssen Sie die maximale Pufferlänge als zusätzliche Parameter müssen Pufferüberlauf-Fehler wie PW wies darauf hin, .

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

i hat bereits eine Verlängerung innerhalb der for-Schleife erhöht worden ist, so können Sie einfach tun:

output[i] = '\0';

Anders als diese, das Programm läuft gut und gibt, was wir Eingang bis zur Rückkehr.

FWIW, Ich habe es getestet, indem sie es wie so Aufruf:

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

Andere Tipps

Es scheint mir die richtige außer geschrieben, dass ich mit Ihnen nicht außerhalb der Schleife erhöhen müssen. Die i unmittelbar vor der Schleife beendet erhöht wird, so dass es ohnehin schon ist, wo Sie es wollen.

Stellen Sie sicher, dass ein '\ n' eigentlich ist es in c macht.

Manchmal bekommen als Trennzeichen ein '\ n' weggeworfen.

Ihr letzter Code als entsandte 3 Fehler haben kann ich sehen:

char* userInput[MAX_INPUT_SIZE];

Sollte sein:

char userInput[MAX_INPUT_SIZE+1];

(dies wurde bereits erwähnt von Pax Diablo)

getInput(&userInput);

Sollte sein:

getInput( userInput );

Dieser letzte Fehler bedeutet, dass Sie eine Adresse in Ihrem Call-Stack GetInput geben. Sie haben einen Speicher überschreiben. wahrscheinlich einer der Anrufe von getchar () returnes an die falsche Adresse.

ein einfacher Weg, Pufferüberlauf zu riskieren, weil Größe der Ausgabe wird nie bestanden / geprüft

Haben Sie versucht, mit einem Debugger? Sie sollten durch den Code in GDB oder Visual Studio Schritt oder was auch immer Sie verwenden, und sehen, was los ist. Sie sagen, Sie ein Anfänger sind so vielleicht hatte man nicht berücksichtigt, dass noch -. Dies eine ziemlich normale Debug-Technik verwenden

Dies ist das komplette Programm mit einem paar Updates von Ihrem Eingang, aber es wird immer noch nicht aus der Schleife machen. BTW war diese Übung 24.1 auf S. 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;
}

Hier ist der letzte Arbeitscode. Ich muss sagen, dass ich zu tun, um dieses ein ziemlich viel abgeholt. Danke für die Hilfe und Zeiger.

Haben Sie Vorschläge, wie die Dinge könnten besser gemacht werden?

#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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top