2

我想右对齐左侧填充零的字符串值。我编写了以下代码,但它打印的是空白而不是 0。

#include<stdio.h>

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

    Output: "  PJ"

    I need output as "00PJ".
4

4 回答 4

2

你可以这样做:

#define MIN_LEN 4

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

不要忘记包括<string.h>

编辑: 为了解释我们关于缓冲区溢出的讨论,试试这段代码:

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);

}

输出 :

Output =PJHA
Test =12345600

如果将大小更改为5,则代码将被更正,并且字符串后面的堆栈不会损坏。

于 2013-08-13T09:24:21.797 回答
1

这是我的问题的简短代码答案:-这将处理任何长度的输入变量,例如s = "J", s="JH", s="JHA", s="PJHA" ,相应的输出将是"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
于 2013-08-13T10:13:22.290 回答
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;
}
于 2013-08-13T10:33:51.110 回答
0

欣赏上述更简单的解决方案,同时提供另一种更手动的解决方案:

#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;
}
于 2013-08-13T09:30:31.133 回答