我想右对齐左侧填充零的字符串值。我编写了以下代码,但它打印的是空白而不是 0。
#include<stdio.h>
int main()
{
char s[4]="PJ";
printf("%04s",s);
}
Output: " PJ"
I need output as "00PJ".
我想右对齐左侧填充零的字符串值。我编写了以下代码,但它打印的是空白而不是 0。
#include<stdio.h>
int main()
{
char s[4]="PJ";
printf("%04s",s);
}
Output: " PJ"
I need output as "00PJ".
你可以这样做:
#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
,则代码将被更正,并且字符串后面的堆栈不会损坏。
这是我的问题的简短代码答案:-这将处理任何长度的输入变量,例如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
#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;
}
欣赏上述更简单的解决方案,同时提供另一种更手动的解决方案:
#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;
}