2016-04-01 5 views
1

Ich habe mit einer Gruppe an einem Google Code Jam-Übungsproblem gearbeitet (Sie können es lesen here). Unser Code ist wie folgt:C Unerwartete Eingaben mit Zeichenarrays

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

main(){ 
    int c; 
    int n = 0; 
    int l = 0; 
    int d = 0; 
    int caseCount = 0; 
    int i = 0; 
    int j = 0; 
    //A boolean value used in determining parenthesees. 
    bool letBool = false; 
    //A boolean value used in determining something; 
    bool wordBool = false; 
    //Temporary space for test characters 
    char test[1000]; 
    //Gets word length 
    while((c=getchar())!=' ' && c!= '\n'){ 
    l = (l * 10) + c - '0'; 
    //printf("%d\n", l); 
    } 
    //Gets number of valid words. 
    while((c=getchar())!=' ' && c!= '\n'){ 
    d = (d * 10) + c - '0'; 
    //printf("%d\n", d); 
    } 
    //Gets number of test cases. 
    while((c=getchar())!= '\n'){ 
    n = (n * 10) + c - '0'; 
    //printf("%d\n", n); 
    } 
    //Array of all valid words. 
    char dict[d][l]; 
    c=getchar(); 
    //While we still have words to read in. 
    while(i < d){ 
    //If not new line 
    if(c!='\n'){ 
     //Then read character 
     dict[i][j] = c; 
    } 
    else{ 
     i++; 
     j=0; 
    } 
    c=getchar(); 
    j++; 
    } 
    i = 0; 
    j = 0; 
    while(i < n){ 
    j = 0; 
    while((c=getchar())!='\n' && c!=EOF){ 
     putchar(c); 
     test[j] = c; 
     j++; 
    } 
    putchar('\n'); 
    test[j+1] = '\0'; 
    printf("%s\n", test); 
    int word = 0; 
    //Going through valid words 
    while(word < d){ 
     wordBool=true; 
     j = 0; 
     int letter = 0; 
     //Going through valid letters 
     while(letter < l){ 
     letBool=false; 
     if(test[j] == '('){ 
      while(test[j++]!=')'){ 
      if(dict[word][letter]==test[j]){ 
       letBool=true; 
       //printf("%s%d%s%d\n" "letBool is true at word: ", word, "letter: ", letter); 
      } 
      } 
     } 
     else{ 
      if(test[j]==dict[word][letter]){ 
      letBool=true; 
      //printf("%s%d%s%d\n" "letBool is true at word: ", word, "letter: ", letter); 
      } 
     } 
     j++; 
     letter++; 
     if(!letBool){ 
      wordBool=false; 
      //printf("%s%d%s%d\n" "wordBool is false at word: ", word, "letter: ", letter); 
     } 
     } 
     if(wordBool){ 
     caseCount++; 
     } 
     word++; 
    } 
    printf("%s%d%s%d\n", "Case #", i+1, ": ", caseCount); 
    i++; 
    j=0; 
    caseCount=0; 
    } 
} 

Das Problem ist der Ausgang den Eingang für den „erhielt fremden Code“ Teil mit aus putchar richtig zu lesen scheint, aber wenn es in den Testfall eingegeben wird, wird es beschädigt. Hier ist der Teil über die ich spreche:

while((c=getchar())!='\n' && c!=EOF){ 
     putchar(c); 
     test[j] = c; 
     j++; 
    } 
    putchar('\n'); 
    test[j+1] = '\0'; 
    printf("%s\n", test); 

Wenn wir es diesen Eingang geben:

3 5 4 
abc 
bca 
dac 
dbc 
cba 
(ab)(bc)(ca) 
abc 
(abc)(abc)(abc) 
(zyx)bc 

wir bekommen

ab)(bc)(ca) 
ab)(bc)(ca) 
7 
Case #1: 0 
abc 
abc 
b 
Case #2: 1 
(abc)(abc)(abc) 
(abc)(abc)(abc) 
Case #3: 0 
(zyx)bc 
(zyx)bcb 
Case #4: 0 

(
Case #5: 0 

So können wir nicht verstehen, warum es zufällig sind Zeichen wie 7 und b ausgedruckt.

+1

Ein Fehler ist hier: 'Test [j +1] = '\ 0'; 'Es sollte' test [j] = '\ 0'; 'sein, da' j' bereits um den vorherigen Zeichenindex erhöht wurde. –

+0

Vielen Dank für die Hilfe! – MegaZeroX

+0

Das ist eine Wettbewerbsseite. Sie sollten das Problem selbst lösen. Du könntest sogar eine Antwort finden, es gibt immer 'Cheat' Seiten. –

Antwort

0

ändert diese:

test[j+1] = '\0'; 

dazu:

test[j] = '\0'; 

Der Grund dafür ist, dass Sie bereits j ‚s Wert erhöht, am Ende der while-Schleife, bevor die Abschlussbedingung erfüllt wurde :

j = 0; 
while((c=getchar())!='\n' && c!=EOF){ 
    putchar(c); 
    test[j] = c; 
    j++; <------ 
} 
putchar('\n'); 
test[j] = '\0'; 

Also, mit test[j + 1], s Sie tatsächlich habe eine Zelle ausgespuckt. Das bedeutet, dass Sie Undefined Behavior auftreten, da diese übersprungene Zelle Junk enthält, da test nicht zu nichts initialisiert wurde. Als Ergebnis wissen wir nicht, was diese Zelle enthält, sie enthält Junk.

Ausgang mit dem korrigierten Code:

[email protected]:~$ gcc -Wall px.c 
[email protected]:~$ ./a.out 
3 5 4 
abc 
bca 
dac 
dbc 
cba 
(ab)(bc)(ca) 
abc 
(abc)(abc)(abc) 
(zyx)bcab)(bc)(ca) 
ab)(bc)(ca) 
Case #1: 0 
abc 
abc 
Case #2: 1 
(abc)(abc)(abc) 
(abc)(abc)(abc) 
Case #3: 0 

(zyx)bc 
(zyx)bc 
Case #4: 0 

Außerdem Verwendung:

int main(void) { 
    ... 
    return 0; 
} 

Weitere, dies lesen: What should main() return in C and C++?

+1

Danke! Ich lerne gerade c, also wusste ich nicht, dass es für die Hauptfunktion erwartet wurde, diese Standards zu haben! Tut mir leid, wenn die Frage nicht gut gestellt wurde, wie mir ein Oberklasse-Mann vor ein paar Minuten gesagt hat! Das ist alles was ich wirklich brauche, da der Rest des Problems definitiv in meiner Fähigkeit liegt herauszufinden, warum wir nicht die richtige Anzahl von Fällen bekommen! – MegaZeroX

+0

@MegaZeroX jetzt haben Sie gelernt. :) Überprüfen Sie meine aktualisierte Antwort (tat das gerade jetzt)! Ok viel Glück! – gsamaras

Verwandte Themen