2017-09-16 21 views
4

Habituellement, j'utilise une définition pour la taille d'une chaîne, mais quand j'utilise scanf(), je veux empêcher la fonction de lire trop de caractères (et réserver de l'espace pour la terminaison nulle). Je me demandais si je pouvais le faire en utilisant ma définir, au lieu d'un nombre magique ... hardcodedGarde scanf de lire trop de caractères avec une définition?

#include <stdio.h> 

#define MAXLEN 4 

int main(void) { 
    char a[MAXLEN]; 
    scanf("%3s", a); // Can I do that with 'MAXLEN' somehow? 
} 

Est-il possible? Si oui, comment?

+0

utilisation MAXLEN 3; puis définissez 'char a [MAXLEN + 1]' –

+0

J'ai lié à la copie, mais pourquoi n'utilisez-vous pas 'fgets()' et 'sscanf()'? –

+0

Je pourrais, mais je me demandais à propos de 'scanf()' @IharobAlAsimi, merci! – gsamaras

Répondre

9

Utilisation définit à stringify:

#define LENSTR_(x) #x 
#define LENSTR(x) LENSTR_(x) 

vous pouvez utiliser:

#define MAXLEN 3 

char a[MAXLEN + 1]; 
scanf("%" LENSTR(MAXLEN) "s", a); 
+1

@ Jean-FrançoisFabre car c'est comme ça que l'on ficelle les valeurs des arguments de macro en C ... –

+0

Je ne comprends pas fonctionne mais il le fait, je suis upvoting – savram

+1

@AnttiHaapala: Oui, mais la plupart seulement copier ce modèle sans savoir ** pourquoi ** c'est nécessaire. Et cela ne fonctionne pas comme prévu pour les champs variables. Que faire si vous avez un VLA? – Olaf