2016-04-01 26 views
1

Google Code Jam uygulama sorununda bir grupla çalışıyordum (okuyabilirsiniz here). aşağıdaki gibidir kodudur:C Karakter dizileriyle beklenmedik girişler

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

sorun çıktı doğru dışarı putchar ile "alınan yabancı kod" bölümü için giriş okumaya görünüyor, ama test durumu girildiğinde, bu bozulur. biz bu girişi verdiğinde

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

: Burada söz ediyorum parçasıdır

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

biz Yani

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 

olsun, biz rastgele vardır nedenini anlayamıyorum 7 ve b gibi karakterler yazdırılır.

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

Buna: Bu

+1

bir hata burada: 'testi [j +1] = '\ 0'; '' [j] = '\ 0'; 'olmalıdır, çünkü j' önceden bir önceki karakter dizinini geçmiştir. –

+0

Yardım için çok teşekkür ederim! – MegaZeroX

+0

Bu bir yarışma sitesidir. Sorunu kendiniz çözmeniz gerekiyor. Hatta bir cevap arayabilirsin, her zaman 'hile' siteleri vardır. –

cevap

0

Değişim

test[j] = '\0'; 

nedeni sonlandırma koşulu karşılandı önce zaten, while döngüsünün sonunda, j 'ın değerini artırılır olmasıdır :

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

Yani, test[j + 1] ile, aslında s bir hücreyi uçurdu. Tanımsız Davranış deneyimlediğiniz anlamına gelir, çünkü atlanan hücre önemsizdir, çünkü test hiçbir şey için başlatılmamıştır. Sonuç olarak, bu hücrenin ne içerdiğini bilmiyoruz, önemsiz içeriyor. düzeltilmiş kodu ile

Çıkış:

[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 

Ayrıca, kullanım: Daha fazla bilgi için

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

bu okuyun: What should main() return in C and C++?

+1

Teşekkürler! Şu an c öğreniyorum, bu yüzden ana fonksiyonun bu standartlara sahip olmasının beklendiğini bilmiyordum! Sorunun iyi bir şekilde sorulmadığı için üzgünüm, bir üst sınıfın bana birkaç dakika önce söylediği gibi! Sorunun geri kalanı kesinlikle doğru sayıda davayı neden almadığımızı anlayabilmem için gerçekten ihtiyacım olan şey buydu! – MegaZeroX

+0

@MegaZeroX şimdi öğrendiniz. :) Güncellenmiş cevabımı kontrol ettiğinizden emin olun (bunu şimdi yaptık)! Tamam iyi şanslar! – gsamaras