2009-09-23 7 views
4

Je dois écrire un nombre variable de caractères dans un fichier. Par exemple, disons que je veux imprimer 3 caractères. "TO" afficherait "TO" dans un fichier. "LongString of Characters" afficherait "Lon" dans un fichier.Comment définir le nombre de caractères générés dans un format fprintf '% s' à l'aide d'une variable?

Comment est-ce que je peux faire ceci? (le nombre de caractères est défini dans une autre variable). Je sais que cela est possible fprintf (fichier, « % 10s », chaîne), mais 10 est prédéfini

Répondre

18

Celui-ci correspond à votre exemple:

fprintf(file, "%*s", 10, string); 

mais vous mentionné un maximum aussi bien, à limiter aussi le nombre:

fprintf(file, "%*.*s", 10, 10, string); 
+1

+1 pour rester simple. – Ashwin

1

Je crois que vous avez besoin « % * s » et vous aurez besoin de passer la longueur comme un entier avant la chaîne.

+0

Cela imprimera au moins autant de caractères et ne limitera pas le nombre de caractères imprimés. –

1

Comme alternative, pourquoi ne pas essayer ceci:

void print_limit(char *string, size_t num) 
{ 
    char c = string[num]; 
    string[num] = 0; 
    fputs(string, file); 
    string[num] = c; 
} 

tronque temporairement la chaîne à la longueur que vous voulez et il restaure. Bien sûr, ce n'est pas strictement nécessaire, mais ça fonctionne, et c'est assez facile à comprendre.

+1

Si vous faites ceci ... assurez-vous que la longueur de 'string' est au moins' num-1' ou vous écraserez temporairement un octet de mémoire aléatoire !! – jnylen

+0

Ceci est vrai. Que ce soit une leçon de ne jamais faire confiance à du code écrit à la hâte/paresseusement que vous sortez d'Internet. –

0

Comme alternative, vous pouvez créer « c_str » de votre tampon et préparer la chaîne à printf comme je le fais dans cette source:

void print(char *val, size_t size) { 
    char *p = (char *)malloc(size+1); // +1 to zero char 
    char current; 
    for (int i=0; i < size; ++i) { 
     current = val[i]; 
     if (current != '\0') { 
      p[i] = current; 
     } else { 
      p[i] = '.'; // keep in mind that \0 was replace by dot 
     } 
     p[i+1] = '\0'; 
    } 
    printf("%s", p); 
    free(p); 
} 

Mais la solution mauvaise façon. Vous devriez utiliser fprintf avec le format "% * s".

Questions connexes