2017-03-08 5 views
1

Je suis un débutant à Xcode et j'apprends C en utilisant l'outil de ligne de commande. Souvent, lorsque j'écris un programme et que j'entre une entrée, le code ne s'exécute pas la première fois que je l'entre, mais une fois que cette première entrée est ignorée, le code s'exécute exactement comme prévu. Je me demandais juste pourquoi c'est ça? Est-ce que je fais quelque chose de mal quand j'écris mon code ou est-ce juste quelque chose qui arrive dans Xcode?Lorsque j'entre une entrée en utilisant l'outil de ligne de commande dans Xcode, le code l'ignore la première fois que je l'entre. Pourquoi est-ce et est-il un moyen de l'éviter?

Exemple de code dans lequel cela se produit (c'est quelque chose que j'ai dû faire pour l'université.) Il lit une entrée "celsius = [quelque chose]" et affiche un graphique montrant la conversion de celsius en fahrenheit et fait des commentaires dessus):

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

int main() 
{ 
    int start; 
    int celsius; 
    float fahrenheit; 

    scanf("celsius=%d\n", &start); 

    if(start<0||start>100) 
    { 
      printf("The value entered should be in the right range\n"); 
    } 
    else 
    { 
     printf("Celsius | Fahrenheit | comment\n"); 
     printf("------------------------------\n"); 

     for(celsius=start;celsius<=100;celsius=celsius+20) 
     { 
      fahrenheit=celsius*(9.0/5.0)+32; 
      printf(" %d | %.2f |", celsius, fahrenheit); 

      if(fahrenheit==32.0) 
      { 
       printf(" Freezing point\n"); 
      } 
      else if(fahrenheit>=64.0&&fahrenheit<=77.0) 
      { 
       printf(" Room temperature\n"); 
      } 
      else if(fahrenheit>=122.0&&fahrenheit<=176.0) 
      { 
       printf(" Hot bath\n"); 
      } 
      else if(fahrenheit==212.0) 
      { 
       printf(" Water boils\n"); 
      } 
      else 
      { 
       printf("\n"); 
      } 
     } 
    } 

    return 0; 
} 

Répondre

0

la chaîne de format fourni en scanf() doit avoir la même entrée exacte à un match de . Dans le cas

scanf("celsius=%d\n", &start); 

crée le problème , il attend une entrée qui est constitué d'

  • celsius= chaîne
  • et valeur entière
  • une (ou plusieurs) whitespace

et un autre newline, pour terminer l'entrée. Donc, enfin, vous avez besoin de deux touches ENTER pour répondre aux critères. La première pression produit un newline qui correspond à l'exigence de l'espace et la deuxième fois, il produit une autre nouvelle ligne, qui termine l'entrée.

connexes, citant C11, chapitre §7.21.6.2,

Une directive composée de caractère blanc (s) est exécutée par la lecture de l'entrée jusqu'à la premier caractère non blanc (qui reste non lu), ou jusqu'à ce qu'il ne soit plus possible de lire . [...]

Vous devez réduire à

scanf("celsius=%d", &start); //remove the trailing `\n` 

et vérifier la valeur de retour de scanf() pour assurer le succès.