2016-12-28 2 views
1

Hier ist die Beschreibung des Problems https://a2oj.com/p?ID=193, es funktioniert sehr gut auf Visual Studio, aber aus irgendeinem Grund produziert es Runtime - Fehler auf der Website der Richter Compiler, es ist schwer für mich zu erkennen Da ihr Compiler nicht mitteilt, was der Testfall war, erzeugte der Fehler.Runtime Error - C Programmierung, kein Fehler auf IDE

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define ASCII_SIZE 255 
void main(){ 
    int testCases; 
    char caseInput[100]; 
    int count[ASCII_SIZE] = {0}; 
    int strLength; 
    int max = -1; 
    char result = NULL; 
    typedef struct occurrence{ 
     int numOfOcc; 
     char occLetter; }Occurence; 
    scanf("%d",&testCases); 
    Occurence *ptr; 
    ptr = (Occurence*)malloc(testCases * sizeof(Occurence)); 
    if (ptr){ 
    for (int caseValue = 0; caseValue < testCases; caseValue++) 
     { 
     scanf("%s",caseInput); 
     strLength = strlen(caseInput); 
     for (int i=0; i<strLength; i++) 
      count[caseInput[i]]++; 
     for (int i = 0; i < strLength; i++) { 
      if (max <= count[caseInput[i]]) { 
       if (result > caseInput[i] && i > 0){ 
       max = count[caseInput[i]]; 
       result = caseInput[i]; 
        } 
       else if (i == 0){ 
         max = count[caseInput[i]]; 
         result = caseInput[i]; 
        } 

       } 
      } 
     ptr[caseValue].numOfOcc = max; 
     ptr[caseValue].occLetter = result; 
     max = -1; 
     char result = NULL; 
     memset(count,0,sizeof(count)); 
     } 
    for (int i = 0; i < testCases; i++) 
     { 
     printf("%d %c\n",ptr[i].numOfOcc,ptr[i].occLetter); 
     } 
     } 
    } 
+0

Ich habe das schon mal mit ihrem Compiler/Testbed gesehen: Ihr 'void main()' ist eine passende falsche Deklaration und muss 'int main' sein. Als Ergebnis gibt Ihr 'main' einen undefinierten Wert zurück, der von ihrem Testbett als Fehler interpretiert wird und somit einen Laufzeitfehler meldet. Lassen Sie es 0 zurückgeben. –

+0

Ja danke ich tat das, aber jetzt sagt es falsche Antwort aus irgendeinem Grund, obwohl es sehr gut auf der IDE funktioniert und es ist schlecht, dass ihr Compiler nicht sagt, welcher Testfall den Code fehlgeschlagen – andrewnagyeb

Antwort

0

Sie nicht eine Eingabezeichenfolge mit bis zu 100 Buchstaben in Ihrem Puffer speichern:

char caseInput[100]; 

Sie haben vergessen zu zählen die abschließenden '\0'

Nicht im Zusammenhang mit Fehlerlaufzeit, aber wahrscheinlich noch unbeabsichtigt:

max = -1; 
char result = NULL; 
memset(count,0,sizeof(count)); 

Hier definieren Sie eine Sekunde ond result versteckt die vorherige Definition.

auch wahrscheinlich, um Ihr Problem nicht im Zusammenhang:

void main() 

nicht korrekt ist. Machen Sie es

int main(void) 

oder

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

und 0 zurück auf Erfolg.

+0

ich didn ' t verstehst du wirklich, was du meinst "Du hast vergessen, den Abschluss '\ 0'" – andrewnagyeb

+0

einzuschließen Du könntest die Grundlagen von Strings in C noch einmal lesen wollen. Eine Zeichenkette wie "Hallo" benötigt 6 Bytes Speicher, da alle Zeichenketten null-terminiert sind, d. H. Sie haben ein abschließendes "\ 0" -Byte am Ende. Wenn der Testfall eine Zeichenfolge mit genau 100 Buchstaben eingibt, benötigen Sie 101 Byte, wobei 'scanf' das Ergebnis speichern kann. Sie stellen nur 100 Bytes zur Verfügung. – Gerhardh

+0

Yeah Gotcha, ich musste nur wissen, was genau ich ändern muss – andrewnagyeb