2010-12-09 37 views
1

J'ai du mal à accepter les entrées d'un fichier texte. Mon programme est supposé lire dans une chaîne spécifiée par l'utilisateur et la longueur de cette chaîne est déterminée au moment de l'exécution. Cela fonctionne bien quand l'utilisateur exécute le programme (en entrant manuellement les valeurs) mais quand je cours le dossier de texte de mon professeur, il court dans une boucle infinie.L'utilisation de scanf pour lire une certaine quantité de caractères dans C?

Pour cet exemple, il échoue lorsque je prends 4 caractères et que son entrée dans son fichier est "ABCDy". "ABCD" est ce que je suis censé lire et "y" est censé être utilisé plus tard pour savoir que je devrais recommencer le jeu. Au lieu de cela, lorsque j'ai utilisé scanf pour lire dans "ABCD", il lit aussi dans le 'y'. Y at-il un moyen de contourner cela en utilisant scanf, en supposant que je ne sais pas combien de temps la chaîne devrait être jusqu'à l'exécution?

Répondre

0

Essayez

scanf("%4s", str) 
+0

Il est en train de lire encore dans la y à la fin. Et je ne sais pas combien de temps la valeur peut être. – Kira

13

Normalement, vous devriez utiliser quelque chose comme "%4c" ou "%4s" pour lire un maximum de 4 caractères (la différence est que "%4c" lit les 4 caractères suivants, peu importe, alors que "%4s" skips menant des espaces et des s'arrête à un espace s'il y en a un). Pour spécifier la longueur au moment de l'exécution, cependant, vous devez obtenir un peu plus compliqué car vous ne pouvez pas utiliser un littéral de chaîne avec "4" incorporé dedans. Une alternative consiste à utiliser sprintf pour créer la chaîne que vous allez passer à scanf:

char buffer[128]; 

sprintf(buffer, "%%%dc", max_length); 
scanf(buffer, your_string); 

Je devrais probablement ajouter: avec printf vous pouvez spécifier la largeur ou la précision d'un champ dynamique en mettant un astérisque (*) dans la chaîne de format, et le passage d'une variable dans la position appropriée pour spécifier la largeur/précision:

int width = 10; 
int precision = 7; 
double value = 12.345678910; 

printf("%*.*f", width, precision, value); 

Étant donné que les chaînes de format printf et scanf sont assez similaires, on pourrait penser la même chose travaillerait avec scanf. Malheureusement, ce n'est pas le cas - avec scanf un astérisque dans la spécification de conversion indique une valeur qui doit être analysée, mais pas convertie. C'est-à-dire quelque chose qui doit être présent dans l'entrée, mais sa valeur ne sera placée dans aucune variable.

+0

+1, j'allais le proposer :) – ruslik

-1

Vous pouvez envisager de simplement boucler les appels vers getc().

+0

C'est comme dire à quelqu'un qui veut dessiner exactement 80 pixels pour appeler putpixel 80 fois. Les deux sont une mauvaise idée dans tous les contextes académiques et de benchmarking, car au lieu d'une seule requête au serveur, vous le bombardez avec un nombre arbitraire de requêtes, dont chacune est plus grande que le résultat. – Dmitry

0

Vous pouvez également utiliser fread, où vous pouvez définir une limite de lecture:

char string[5]={0}; 
if(fread(string,(sizeof string)-1,1,stdin)) 
    printf("\nfull readed: %s",string); 
else 
    puts("error");