2017-05-10 3 views
0

Ich versuche, die Einstellungen meines Terminals nur für Kicks zu bearbeiten. Wenn ich "-a" drücke, sollte "LEFT" auf dem Bildschirm erscheinen. Wenn ich "-w" drücke, sollte "UP" auf dem Bildschirm erscheinen. Wenn ich jedoch mein Programm ausführte, erhalte ich einen Fehler der Segmentierung 11, und ich möchte wissen warum. Mein Code ist unten veröffentlicht und wenn Sie irgendwelche Fragen haben, zögern Sie nicht zu fragen. Danke im Voraus.Segmentierung 11 in C versucht, Stty wiederherzustellen

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <termios.h> 
#include <unistd.h> 

int main(int argc, const char * argv[]) { 

    int result = 0;    // result = file descriptor 
    struct termios attrib;  // attrib that's going to be messed with 
    struct termios sec_attrib; // attrib that's going to reset everything 

    // 
    // TURN OFF: ICANON AND ECHO 
    // TURN ON: VMIN 

    tcgetattr(result, &attrib); //getting the attributes from attrib 
    attrib.c_lflag &= ~ICANON; // turn off ICANON 
    attrib.c_lflag &= ~ECHO; // turn off ECHO 
    attrib.c_cc[VMIN] = 1; 
    tcsetattr(result, TCSANOW, &attrib); 

    int x = 0; 
    while(x != -1){ 
     if(strcmp(argv[1], "-w") == 0){ 
      printf("UP"); 
     } 
     else if(strcmp(argv[1], "-a") == 0){ 
      printf("LEFT"); 
     } 
     else if(strcmp(argv[1], "-s") == 0){ 
      printf("DOWN"); 
     } 
     else if(strcmp(argv[1], "-d") == 0){ 
      printf("RIGHT"); 
     } 
     else if(strcmp(argv[1], "-q") == 0){ 
      x = -1; 
     } 
     else{ 
      continue; 
     } 
    } 

    // reset everything 
    tcsetattr(result, TCSANOW, &sec_attrib); 
    return 0; 
} 
+0

"Ich möchte wissen, warum". Um das herauszufinden, müssen Sie das Debugging durchführen. Und das ist am besten, wenn Sie Ihr Programm in einem Debugger ausführen, dessen Ausführung verfolgen und den Status untersuchen. Der Debugger wird Ihnen beispielsweise sofort und genau sagen, welche Codezeile den Seg-Fehler verursacht. – kaylum

+0

Haben Sie versucht, einen Debugger zu verwenden? – immibis

+0

'strcmp (argv [1]' Das ist nicht korrekt. Die Tasten drücken nicht von der Befehlszeile (die 'argv' enthält). Sie müssen' stdin' lesen. – kaylum

Antwort

1

Sie scheinen unter dem Eindruck zu sein, dass lesen argv[1] liest von der Tastatur. Das ist nicht wahr. Was es tut, ist das erste Befehlszeilenargument zu lesen, d. H. argv[1]. Wenn Sie keine Argumente übergeben, ist dies eine ungültige Adresse, und das Lesen ruft undefined behavior auf.

+0

Ah danke für die Erklärung. –