2017-08-23 1 views
0

Ich möchte ein C-Programm schreiben, wo ich ein Array von 10 Zeichenfolgen habe, wobei jede Zeichenfolge das Kennzeichen des am Punkt geparkten Autos bezeichnet. Ein Spot wird zufällig ausgewählt und wenn er leer ist, wird eine zufällige Nummernschildnummer erzeugt und diesem Spot zugewiesen, und wenn er besetzt ist, wird der Spot geräumt und das Nummernschild wird gelöscht. Allerdings geht das Programm in eine Endlosschleife, was ich will, aber es druckt keine Anweisungen, die ich geschrieben habe, um das Programm zu debuggen. Der Code lautet wie folgt:C-Programm für Park-Simulation keine Ausgabe geben

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <time.h> 
#include <stdint.h> 

char * generateLicense() 
{ 
    srand((unsigned)time(NULL)); 
    char const *code[] = {"AN","AP","AR","AS","BR","CG","CH","DD","DL","DN","GA","GJ","HR","HP","JH","JK","KA","KL","LD","MH","ML","MP","MN","MZ","NL","OD","PB","PY","RJ","SK","TN","TR","TS","UK","UP","WB"}; 
    char const *alphabets[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}; 
    char const *numbers[] = {"0","1","2","3","4","5","6","7","8","9"}; 
    char *licensePlate = (char *)malloc(100*sizeof(char)); 
    strcpy(licensePlate,code[rand()%36]); 
    strcat(licensePlate,"-"); 
    strcat(licensePlate,numbers[rand()%10]); 
    strcat(licensePlate,numbers[rand()%10]); 
    strcat(licensePlate,"-"); 
    strcat(licensePlate,alphabets[rand()%26]); 
    strcat(licensePlate,alphabets[rand()%26]); 
    strcat(licensePlate,"-"); 
    strcat(licensePlate,numbers[rand()%10]); 
    strcat(licensePlate,numbers[rand()%10]); 
    strcat(licensePlate,numbers[rand()%10]); 
    strcat(licensePlate,numbers[rand()%10]); 
    return licensePlate;  
} 

int main() 
{ 
    char *messagebody = (char *)malloc(100*sizeof(char)); 
    char *licensePlate = (char *)malloc(100*sizeof(char)); 
    char *currentSpot = (char *)malloc(10*sizeof(char)); 
    char *by = ", by: "; 
    char *client = "From client 1, "; 
    char *spots[] = {"00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000","00-00-00-0000"}; 
    int spot; 
    printf("variables declared\n"); 
    srand((unsigned)time(NULL)); 
    while(1) 
    { 
     printf("in while loop\n"); 
     //messagebody = ""; 
     //licensePlate = ""; 
     spot = rand()%10; 
     //currentSpot = ""; 
     sprintf(currentSpot, "%d", spot); 
     printf("%s",currentSpot); 
     strcpy(messagebody,client); 
     printf("%s",messagebody); 
     if(spots[spot] == "00-00-00-0000") 
     { 
      printf("%s",messagebody); 
      strcpy(licensePlate, generateLicense()); 
      printf("%s",licensePlate); 
      strcpy(spots[spot], licensePlate); 
      strcat(messagebody,"spot occupied: "); 
      printf("%s",messagebody); 
      strcat(messagebody,currentSpot); 
      printf("%s",messagebody); 
      strcat(messagebody,by); 
      printf("%s",messagebody); 
      strcat(messagebody,licensePlate); 
      printf("%s",messagebody); 
     } 
     else 
     { 
      printf("%s",messagebody); 
      strcpy(licensePlate, spots[spot]); 
      strcpy(spots[spot],"00-00-00-0000"); 
      strcat(messagebody,"spot vacated: "); 
      printf("%s",messagebody); 
      strcat(messagebody,currentSpot); 
      printf("%s",messagebody); 
      strcat(messagebody,by); 
      printf("%s",messagebody); 
      strcat(messagebody,licensePlate); 
      printf("%s",messagebody); 
     } 
     printf("%s",messagebody); 
     sleep(5); 
    } 
    return 0; 
} 

Ich habe die Anweisungen, die ich geschrieben habe, um das Programm zu debuggen. Was mache ich hier falsch?

+1

Auf den ersten Blick: Bitte rufen Sie 'srand' nur einmal am Anfang von' main'. Wenn Sie es wiederholt aufrufen, wird es nicht "zufälliger". Im Gegenteil, mit einer Sekunde Granularität setzen Sie den Seed immer wieder auf den gleichen Wert zurück. –

+1

[Bitte lesen Sie diese Diskussion darüber, warum nicht den Rückgabewert von malloc() und family in C ..] (https://stackoverflow.com/q/605845/2173917) –

+0

auf welchem ​​System/Betriebssystem führen Sie Ihre Programm? hast du versucht, die printf-anrufe zu reduzieren und die schleifenzeit zu erhöhen? – user3336433

Antwort

4

Ihr Programm hat eine Zugriffsverletzung: spots ist ein Array von zehn Stringliterale:

char *spots[] = { 
    "00-00-00-0000", 
    "00-00-00-0000", 
    "00-00-00-0000", 
    ... 
}; 

Diese Literale sind unveränderlich, und es ist ein arror zu versuchen, sie zu ändern.

Definieren Sie stattdessen ein Array von zehn char-Arrays, die Ihre Nummernschilder enthalten können. Sie brauchen Platz für Ihr Muster 2-2-2-4 plus ein Zeichen für den Null-Terminator:

char spots[10][14] = {""}; 

Jetzt spots sind zehn leere Strings von max. 13. Länge können Sie testwhether Sie sie überschrieben wurden bereits mit:

if (*spots[spot] == '\0') ... // string is empty 

Es gibt mehr Probleme Code:

  • Die dynamische Speicherzuweisung ist wirklich nicht notwendig für ein so kleines Programm und mach es kompliziert. Sie haben 10 Steckplätze mit 13-stelligen Nummernschildern, die einfach im automatischen Speicher erstellt werden können.
  • Speicher nicht für das Nummernschild und dann strcpy zuweisen. Erstellen Sie das Kennzeichen direkt, indem Sie den Puffer mit 14 Zeichen an eine Funktion übergeben, die ihn füllt.
  • Die länglichen strcat Sequenzen sind sehr ungeschickt. Erwägen Sie die Verwendung von snprintf, wodurch ein Nummernschild in nur einem Durchgang erstellt wird.

Hier ist eine kurze Einführung des Problems, die 30 Park Aktionen begrenzt:

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

void make_license(char str[]) 
{ 
    static const char *code[] = { 
     "AN", "AP", "AR", "AS", "BR", "CG", "CH", "DD", "DL", 
     "DN", "GA", "GJ", "HR", "HP", "JH", "JK", "KA", "KL", 
     "LD", "MH", "ML", "MP", "MN", "MZ", "NL", "OD", "PB", 
     "PY", "RJ", "SK", "TN", "TR", "TS", "UK", "UP", "WB" 
    }; 

    snprintf(str, 14, "%s-%02d-%c%c-%04d", 
     code[rand() % 36], rand() % 100, 
     'A' + rand() % 26, 'A' + rand() % 26, 
     rand() % 10000);  
} 

int main() 
{ 
    char spots[10][14] = {""}; 
    int n = 30; 

    srand(time(NULL)); 

    while (n--) { 
     int spot = rand() % 10; 

     if (*spots[spot]) { 
      printf("Car %s leaves spot %d.\n", spots[spot], spot + 1); 

      *spots[spot] = '\0';   // remove licence plate 
     } else { 
      make_license(spots[spot]);  // create licence plate 

      printf("Car %s arrives at spot %d.\n", spots[spot], spot + 1); 
     } 
    } 

    puts(""); 
    puts("Final arrangement"); 

    for (n = 0; n < 10; n++) { 
     printf("%4d %s\n", n + 1, spots[n]); 
    } 

    return 0; 
} 

Wenn Sie die dynamische Zuordnung verwenden möchten (vielleicht war es eine Anforderung der Zuweisung), Sie sollte die Nummernschilder Zeiger auf Strings machen. Initialisiere sie NULL, sie befreien, wenn man sie aus der Liste zu entfernen und auch sicher sein, um alle verbleibenden Strings zu befreien, nachdem Sie fertig sind:

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

char *make_license(void) 
{ 
    static const char *code[] = { 
     "AN", "AP", "AR", "AS", "BR", "CG", "CH", "DD", "DL", 
     "DN", "GA", "GJ", "HR", "HP", "JH", "JK", "KA", "KL", 
     "LD", "MH", "ML", "MP", "MN", "MZ", "NL", "OD", "PB", 
     "PY", "RJ", "SK", "TN", "TR", "TS", "UK", "UP", "WB" 
    }; 

    char *str = malloc(14); 

    snprintf(str, 14, "%s-%02d-%c%c-%04d", 
     code[rand() % 36], rand() % 100, 
     'A' + rand() % 26, 'A' + rand() % 26, 
     rand() % 10000); 

    return str; 
} 

int main() 
{ 
    char *spots[10] = {NULL}; 
    int n = 30; 

    srand(time(NULL)); 

    while (n--) { 
     int spot = rand() % 10; 

     if (spots[spot]) { 
      printf("Car %s leaves spot %d.\n", spots[spot], spot + 1); 

      free(spots[spot]); 
      spots[spot] = NULL;    // remove licence plate 
     } else { 
      spots[spot] = make_license(); // create licence plate 

      printf("Car %s arrives at spot %d.\n", spots[spot], spot + 1); 
     } 
    } 

    puts(""); 
    puts("Final arrangement"); 

    for (n = 0; n < 10; n++) { 
     printf("%4d %s\n", n + 1, spots[n] ? spots[n] : "--"); 
     free(spots[n]); 
    } 

    return 0; 
} 

Aber Sie sollten eindeutig entscheiden, welcher Ansatz Sie nehmen. Ihr Programm ist ein bisschen dazwischen: Es reserviert Speicher und versucht dann strcpy um die Daten herum, als ob Sie automatische Speicherpuffer verwenden würden.

+0

Danke M Oehm. Das hat funktioniert. –

Verwandte Themen