2017-04-11 135 views
-3

我想在字符串的开头添加零。我正在使用格式说明符。 我的输入字符串是“你好” 我想输出为“000hello”。C格式化的字符串 - 如何使用sprintf将前导零添加到字符串值?

我知道如何做到这一点整数。

int main() 
{ 
    int i=232; 
    char str[21]; 
    sprintf(str,"%08d",i); 

    printf("%s",str); 

    return 0; 
} 

输出将是 - 00000232

如果我字符串做同样的。

int main() 
    { 
     char i[]="hello"; 
     char str[21]; 
     sprintf(str,"%08s",i); 

     printf("%s",str); 

     return 0; 
    } 

输出将是 - 个招呼(3前导空格)

为什么它是整数的情况下给予的字符串和零的情况下,空间?

+1

的printf( “000000%S”,helloStr) – schil227

+0

我会做的是有一个数组,并且所有的元素设置为 '0' ,除了空终止符的最后一个。然后在适当的地方复制你的字符串(提示:使用'strlen')并打印出来。或者,有一个循环打印出正确数量的'0',然后打印字符串。 – AntonH

+3

*我正在使用格式说明符。我的输入字符串是“你好”*。请发布显示问题的[Minimal,Complete和Verifiable示例](http://stackoverflow.com/help/mcve)。在问题**中显示输入,预期输出和实际输出**。 –

回答

-1
void left_fill_zeros(char* dest, const char* str, int length) 
{ 
    sprintf(dest, "%.*d%s", (int)(length-strlen(str)), 0, str); 
} 

int main(void) 
{ 
    char output[256]; 
    left_fill_zeros(output, "Hello", 10); 
    puts(output); 

    // Total length will be 10 chars 
    // Output will be: "00000Hello" 
    return 0; 
} 
+0

嗯,在审查,我的答案只是有点不同,以应付小宽度,并做了一些错误检查。太糟糕了这个答案的2 DV没有包含一些细节,它的弱点。这当然至少是一个很好的起点。 – chux

-2

为了解决您的具体问题 - 3个零点之前的 “hello” - 然后执行:

#include <stdio.h> 

int main() 
    { 
     char i[] = "hello"; 
     printf("000%s",i); 

     return 0; 
    } 

结果:000hello

现在,如果你不具备多少个零的规范你需要填充不同长度的字符串,那么下面的命令会在固定长度的字符串“hello”前加上3个零,使用sprintf()

#include <stdio.h> 

int main(void) { 
    char i[] = "hello"; 
    char buf[] = "000"; 
    char output[10]; 

    sprintf(output, "%s%s", buf,i); 
    printf("%s\n", output); 

    return 0; 
} 

结果:000hello

+0

我想用sprintf函数来做到这一点。 我可以放多少零。 – kid

+0

好吧,这是更清晰的事情。 – tale852150

+0

@kid - 此更新是否可解决您的问题? – tale852150

-1

如何使用sprintf的前导零添加到字符串值?

使用"%0*d%s"预先置零。

"%0*d" - 零>0分钟宽度,从参数列表*衍生宽度,d打印一个int

字符串预先不需要零时,需要例外。

void PrependZeros(char *dest, const char *src, unsigned width) { 
    size_t len = strlen(src); 
    if (len >= width) strcpy(dest, src); 
    else sprintf(dest, "%0*d%s", (int) (width - len), 0, src); 
} 

然而,我不认为sprintf()是这个职位的合适的工具,并会为下面的代码。

void PrependZeros(char *dest, const char *src, unsigned width) { 
    size_t len = strlen(src); 
    size_t zeros = (len > width) ? 0 : width - len; 
    memset(dest, '0', zeros); 
    strcpy(dest + zeros, src); 
} 

void testw(const char *src, unsigned width) { 
    char dest[100]; 
    PrependZeros(dest, src, width); 
    printf("%u <%s>\n", width, dest); 
} 

int main() { 
    for (unsigned w = 0; w < 10; w++) 
    testw("Hello", w); 
    for (unsigned w = 0; w < 2; w++) 
    testw("", w); 
} 

输出

0 <Hello> 
1 <Hello> 
2 <Hello> 
3 <Hello> 
4 <Hello> 
5 <Hello> 
6 <0Hello> 
7 <00Hello> 
8 <000Hello> 
9 <0000Hello> 
0 <> 
1 <0>