0
votes

C Tailles de spécificateur de format C

Comment accéder à une valeur entière dans un tableau de caractères? XXX

Combien d'octets sera le spécificateur de format % d (je suppose 4?) Dans ce tableau de caractères et comment accéder à la valeur entière B?

J'ai essayé: xxx

sans succès. xxx

c

11 commentaires

Log10 (valeur max du type), arrondi. Donc généralement 10.


Un entier de 4 octets signé peut nécessiter jusqu'à 12 caractères à afficher (inclure le Nul-terminant Nul-terminant Char), par exemple. -2147483648 . Et c'est sans des séparateurs spécifiques locaux.


@ DAVIDC.RANKIN - Y a-t-il un moyen fiable de lire la valeur entière?


Bien sûr, vous pouvez lire un entier à partir d'un flux de fichiers avec scanf / fscanf (non recommandé) ou lire une ligne complète contenant l'entier avec fgets , puis analyser avec < Code> SSCANF (OK, mais seulement Succès / Rapport de défaillance) ou avec strtol (vérification de l'erreur complète, mais vous devez vous assurer que la valeur convertie est int_min <= Intval <= Int_max )


Et laissez-moi clarifier - vous pouvez simplement «lire» les caractères qui composent un entier avec n'importe quelle routine d'entrée et si tout ce dont vous avez besoin est une représentation de caractères de la valeur de la valeur, il n'est pas nécessaire de convertir entier. Vous ne convertissez que la représentation de chaîne en une valeur entière réelle (comme expliqué ci-dessus) - si nécessaire pour effectuer des calculs, etc ... vous pouvez toujours utiliser la chaîne pour affichage, etc.


@ DAVIDC.RANKIN - Comment gérer le décalage de 1 octet cependant? Je veux passer sur le premier personnage. Merci.


& Output_buffer [1] est identique à celui sortie_buffer + 1 ; Tous deux adressent le tableau de caractères à partir de la deuxième position dans le tampon. Cependant, vous ne pouvez pas lancer cela à un int car ce n'est pas un int . C'est une chaîne de caractères qui, si imprimée, ressemblerait à un entier à un lecteur humain.


Peut-être devriez-vous clarifier ce qu'il est exactement que vous essayez de faire.


@ Davidc.Rankin - J'essaie de extraire de manière fiable A, B, C comme variables distinctes.


Eh bien, j'ai écrit une réponse pour B ci-dessous, si vous avez toujours une question sur A et c , laissez-moi savoir et je suis heureux d'ajouter à l'exemple.


@FRA - J'ai mis à jour la réponse pour montrer comment séparer A, B & C à partir du tampon rempli .


3 Réponses :


0
votes

Dans votre exemple, en supposant que la matrice de caractères que vous demandez est de la sortie_buffer et que la taille du caractère est de 1 octet dans votre architecture, le% D prendra 2 octets, un pour chaque chiffre de votre INT (B = 90) . Pour récupérer la valeur, utilisez:

int x; 
sscanf(&output_buffer[1], "%d", &x);
char buffer[255]; 
sscanf(&output_buffer[3], "%[^\n]", buffer);


8 commentaires

Alors devrais-je alors faire la valeur de 'B' un entier court?


Si vous préférez oui, la valeur de B est assez basse


Merci. Et la dernière question: Comment puis-je recevoir la corde à la fin?


Désolé, je n'ai pas compris ta dernière question


Si je voulais alors récupérer la chaîne 'c' après court entier "B" devrais-je faire la même chose? Voir au dessus.


Merci, cependant, cela ne fonctionne pas si 'B' est supérieur à 2 chiffres.


Avez-vous besoin d'une solution générique pour les chiffres "n"?


Le problème de base est que je ne sais pas quelle est la valeur de 'B' est (je ne sais pas combien de chiffres), donc j'ai besoin d'un moyen de simplement lire 2 octets (si c'est une courte int) ou 4 octets (si c'est un int). Va revenir à cela aujourd'hui.



2
votes

Il existe un% N modificateurs qui stocke le nombre réel d'octets écrits dans un int : xxx

mais ce modificateur est considéré comme dangereux; Certaines implémentations nécessitent que la chaîne de format est située dans la mémoire en lecture seule.

Pour rendre la dernière phrase plus claire, un exemple: xxx

puis xxx


2 commentaires

Cela n'est pas clair "Certaines implémentations nécessitent que la chaîne de format est située dans la mémoire en lecture seule." -> Comment le format est-il un attribut en lecture seule relative à "% n" dangerosité?


@chux il est dangereux car printf () avec % n se comporte comme scanf () (écrit en mémoire); Glibc tente d'atténuer cela en nécessitant une mappage en lecture seule lors de la construction avec -d_fortify_source



3
votes

Répondez à votre question initiale, "Combien de caractères "% d " code> prendre?", vous pouvez utiliser un truc avec snaprintf code> en spécifiant le tampon comme null code> et le nombre de caractères comme 0 code>, puis à l'aide de votre "% d" code> chaîne de format et de votre variable B code> B code> , snaprintf code> retournera le nombre de chiffres que la conversion nécessitera, par exemple

$ ./bin/snprintf_string
A90A String

(a) 1st char in buffer        : A
(b) int read from buffer      : 90
(c) remaining chars in buffer : A String


2 commentaires

Heureux d'avoir aidé. Il y a beaucoup d'apprentissage enveloppé dans le court exemple. Prenez la pièce par pièce pour comprendre chaque partie. Si vous avez des questions sur la manière dont une fonction fonctionne, regardez la page de l'homme, par exemple strtol (3) - page manuelle Linux . Il ne suffit pas d'avoir une compréhension superficielle de la façon dont les choses fonctionnent dans C, vous devez plutôt avoir une compréhension exacte des détails. Les pages de l'homme sont cryptiques au début, mais fournissent des détails concis sur la manière dont chaque fonction fonctionne.


Oui c'était une bonne aide. Je suis toujours en train de jouer avec des spécificateurs de format et SnPrintf utilise des caractères non signés. Mon autre message est Stackoverflow.com/questions/54118934/... C'est assez la courbe d'apprentissage.