2015-10-04 1 views
-5

Ce programme ne donne pas la bonne sortie; et il prend une entrée une fois au lieu de 't' fois, tout en entrant pour la première fois dans la boucle for.Pourquoi ce programme génère une mauvaise réponse?

Ce problème est HEADBOB (https://www.codechef.com/problems/HEADBOB)

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    for(t; t>0; t--) 
    { 
     int J=0, Y=0, N=0, I=0, len=0; 
     if(len==0) 
     scanf("%d", &len); 
     char ar[len]; 
     for(J=0; J<len; J++) 
     { 
      scanf("%c",&ar[J]); 
      if(ar[J]=='Y') 
       Y++; 
      else if(ar[J]=='N') 
       N++; 
      else if(ar[J]=='I') 
       I++; 
     } 
     if(I>0) 
      printf("INDIAN\n"); 
     else 
     { 
      if((Y&&!N)||(N&&!Y)) 
       printf("NOT SURE\n"); 
      else if(Y&&N) printf("NOT INDIAN\n"); 
     } 
    } 
} 

ENTRÉE:

NOMBRE DE CAS D'ESSAI

NOMBRE DE PERSONNAGES

N NOMBRE DE PERSONNAGES

EXEMPLE D'ENTRÉE & OUTPU T DU CODE CI-DESSUS:

ENTRÉE:

NNYNN

SORTIE:

PAS DES INDIENS

+0

'if (len == 0)' est toujours vrai. –

+3

Je vote pour fermer cette question hors-sujet parce que SO n'est pas un service de débogage. – SJuan76

+0

les noms de toutes les capitales sont souvent réservés aux macros et aux constantes. Et en utilisant toutes les majuscules signifie que vous criez aux gens –

Répondre

0

Le problème est que la deuxième scanf (scanf("%d", &len);) l affiche un caractère de nouvelle ligne dans le flux d'entrée standard (stdin). Ce caractère est ensuite consommé par le troisième scanf (scanf("%c",&ar[J]);) dans la première itération de la boucle.

Changer

scanf("%d", &len); 

à

scanf("%d%*c", &len); 

va résoudre le problème. %*c indique scanf pour lire et rejeter un caractère.

1

Cochez cette case si scanf("%c", &ar[j]) lit les caractères d'espacement! Pensez à

scanf(" %c", &ar[j]); 

Cela signifie sauter tous les caractères blancs (espace, onglets, \n s, etc.). Ou encore mieux:

scanf("%d", &len); 
char ar[len + 1]; // + 1 for 0-termination 
scanf(" %s", ar); // skip all whitespace characters, then read a string 

lecture chaîne complète d'un seul coup est beaucoup plus rapide.