【问题标题】:Right Aligning Decimal String in C在C中右对齐十进制字符串
【发布时间】:2016-03-22 07:45:22
【问题描述】:

我有 2 个十进制字符串,只有 2 个小数点。这些字符串一个一个打印在另一个下方。我需要一种方法来正确对齐这些字符串,以便这些字符串正确对齐。像这样

256.60
 59.00

char max[20]="";
char cmax[20]="";
strcat(max,"STB Amount: ");
strcat(max,stbamount);
strcat(cmax,"PKG Amount: ");        
strcat(cmax,pkgamount);
//strcat(cmax,".00");
prn_write_text(max,strlen(max),1);
prn_write_text(cmax,strlen(cmax),1);

这里prn_write_text 是使用热敏打印机的 API 调用。24 是论文的中心点。我尝试添加一些空格(见下面的代码),但它不起作用。


    int yyer=24+(24-strlen(stbamount));

    int c=0;
    for (c=0;c<yyer;yyer++)
    {
       strcat(max," ");
    }

请指教。

更新:

3.3.1.6 int prn_write_text ( unsigned char * text2, int len, int font )
此 API 函数用于打印文本。 参数 text2,: 描述:指向要打印的文本的缓冲区的指针。类型:输入
len,: 描述:文本的长度。类型:输入
font,: 说明:文字的字体 目前有两种字体 支持。(1 和 2 种字体)。
类型:输入

更新:

我尝试增加缓冲区大小,但在这些值的情况下,最后一个零被截断

    char amount1[10]="";
    char amount2[10]="";
    char dummyamount[20]="";
    float bamt1,bamt2,amt1,amt2;
    float balance1,balance2;
    char sbal[20]="";
    char pbal[20]="";
    char x1 = balance1;
    char x2 = balance2;
    int tmp1 = balance1 * 100;
    balance1 = tmp1 / 100.0;
    int tmp2 = balance2 * 100;
    balance2 = tmp2 / 100.0;
    char buf1[25]="";
    char buf2[25]="";

    snprintf(buf1, sizeof buf1, "%.2f", balance1);
    printf("\nbuffer1 ---------->%f\n",buf1);   
    snprintf(buf2, sizeof buf2, "%.2f", balance2);
    printf("\nbuffer2 ---------->%f\n",buf2);



      memset(max,0,sizeof(max));
      memset(cmax,0,sizeof(cmax));
      snprintf(max, 20,"STB Balance:%8s", buf1);
      snprintf(cmax, 20,"PKG Balance:%8s", buf2);
      prn_write_text(max,strlen(max),1);
      prn_write_text(cmax,strlen(cmax),1);

如果是-2003.30 这样的值,我只会得到-2003.0。我不知道上面的切割逻辑或snprintf 是否会导致问题。

【问题讨论】:

  • 通过printf() 使用可选的最小字段宽度。
  • 这完全取决于prn_write_text 的具体实现方式,最小宽度等等。不知道有什么可能,我们无法为您提供帮助。
  • 不是特定于 C 的,也不是优雅的 .. 但我所做的是创建一个 MAX 字符字符串(在本例中为 10 个)并填充我的“填充”字符。我将使用“0”进行演示,因为它比空格更容易看到:“0000000000”,然后我添加我想要右对齐的字符串“0000000000”+“59.00”。然后我取我的 MAX 字符的右手子字符串:“0000059.00”.. 使用空格而不是零(正如我所说,不优雅但在任何地方都可以使用,只要你可以添加和子串字符串)
  • 示例只打印2个十进制数字,代码示例完全不相关,您没有说prn_write_text如何使用...对不起,这个问题不清楚
  • @SouravGhosh 请查看更新。我该怎么做?

标签: c


【解决方案1】:

@gsamaras 的回答是正确的方法。好吧,当他应该使用snprintf 时,他直接使用了printf,但是给出的唯一元素已经是一个不错的猜测。

如果要输出很多字符串,你甚至可以重用缓冲区:

char max[20]="";
snprintf(max, 20, "STB Amount:%8s", stbamount);
prn_write_text(max,strlen(max),1);
snprintf(max, 20, "PKG Amount:%8s", pkgamount);
prn_write_text(max,strlen(max),1);

假设您要打印的内容长度超过 8 个字符,比如 16 个。您必须增加缓冲区大小以及打印宽度:

char max[28]="";
snprintf(max, 28, "STB Amount:%16s", stbamount);
prn_write_text(max,strlen(max),1);
...

这里的规则是:buffer的大小(28) = fix part的大小(11) + var的大小(16) + 1(terminating NULL)

【讨论】:

  • 谢谢....如果我要打印 6 个字符串...我可以对所有字符串都使用这种方法吗?
  • 但是缓冲区max 不是已经包含值了...我在做memset(max,0,sizeof(max));
  • @techno:它是re-used,意味着以前的值被覆盖。这就是为什么我的代码在再次调用snprintf 之前调用prn_write_text
  • 好的...但是当字符串长度增加时,例如:STB Balance 最后一个0 被截断。
  • @techno:在这种情况下,您必须增加max 缓冲区的大小。我总是更喜欢截断输入,而不是默默地写过去缓冲区的末尾并调用未定义的行为!
猜你喜欢
  • 2016-08-23
  • 2022-07-22
  • 2017-02-11
  • 1970-01-01
  • 2016-03-06
  • 2015-03-29
  • 2019-04-04
  • 2014-03-07
  • 2018-01-03
相关资源
最近更新 更多