2013-08-13 1 views
1

Je veux justifier à droite une valeur de chaîne avec le zéro rempli du côté gauche. J'ai écrit le code suivant, mais il imprime un espace blanc au lieu de 0.Chaîne remplie de zéro justifiée à droite dans C

#include<stdio.h> 

    int main() 
    { 
      char s[4]="PJ"; 
      printf("%04s",s); 
    } 

    Output: " PJ" 

    I need output as "00PJ". 
+3

Le zéro est dans la spécification de format est uniquement pour la sortie numérique, et non pas des chaînes. Vous devez l'ajouter manuellement. L'utilisation du zéro pour les types non numériques est indéfinie. –

Répondre

2

Vous pouvez faire quelque chose comme ceci:

#define MIN_LEN 4 

if (strlen(s) < MIN_LEN) { 
    printf("%0*d%s", MIN_LEN-(int)strlen(s), 0, s); 
} 
else { 
    printf("%s", s); 
} 

Ne pas oublier d'inclure <string.h>

Edit: Pour expliquer notre discussion sur le dépassement de tampon, essayez simplement ce code:

int main() 
{ 
    struct 
    { 
    char s[4]; 
    int i; 
    } test; 

    test.i = 0x12345678; 

    strcpy(test.s,"PJHA"); 
    printf("Output =%s\nTest =%x",test.s,test.i); 

} 

Sortie:

Output =PJHA 
Test =12345600 

Si vous modifiez la taille de 5, le code est corrigé et la pile après votre chaîne n'est pas corrompu.

+0

Merci @ Michael, mais j'essaie d'utiliser memset pour réduire la ligne de codes. – CodeCodeCode

+0

Veuillez vérifier ma réponse et suggérer des erreurs. Merci. – CodeCodeCode

+0

Note: Si le 4 dans 's [4] OP est lié au 4 dans' "% 04s', alors' strlen (s) chux

0

Appréciez la solution ci-dessus plus simple tout en donnant une alternative plus manuel un:

#include<stdio.h> 
#include<string.h> 

void print(char *s, int ncount) 
{ 
    if(s == NULL) return; 
    int len = strlen(s); 
    if(len > ncount) printf("%s", s); 
    else { 
     for(int i = 0; i < ncount - len; ++i) 
      printf("0"); 
     printf("%s", s); 
    } 
} 
int main() 
{ 

    char s[4]="PJ"; 
    print(s, 4); 
    return 0; 
} 
+0

Merci @lulyon Mais vous pensez vraiment que nous – CodeCodeCode

+0

C'est correct, j'ai réfléchi à ça, ça ne me surprend pas, je pense que la réponse de Michael est excellente et apporte quelque chose de nouveau pour moi. – lulyon

0

Voici la réponse de code court de ligne pour ma question: - Cela va prendre soin de toute la longueur de la variable d'entrée comme s = "J", s="JH", s="JHA", s="PJHA" et la sortie correspondante sera "000J", "00JH", "0JHA", "PJHA".

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
     char s[4],s2[4]; 
     strcpy(s,"JH"); 
     sprintf(s2,"%04s",s); 
     memset(s2,'0',4-(int)strlen(s)); 
     printf("Output =%s\n",s2); 

} 
Output =00JH 
+2

peut-être 'char s [5], s2 [5];' – BLUEPIXY

+0

@BLUEPIXY Oui, nous pouvons utiliser la taille '5' aussi pour le dernier caractère nul Dans les deux cas ci-dessus, la solution fonctionnera – CodeCodeCode

+0

' Dans les deux cas, la solution fonctionnera .' cas de 's =" PJHA "'? – BLUEPIXY

0
#include <stdio.h> 
#include <string.h> 

int main(){ 
    char s[5]="PJ"; 
    char padding[sizeof(s)] = {0}; 
    int width = sizeof(padding)-1; 

    memset(padding, '0', width); 
    width -= strlen(s); 

    //printf("%.*s%s\n", (int)(4-strlen(s)), "0000", s); 
    printf("%.*s%s\n", width, padding, s); 
    return 0; 
} 
Questions connexes