在sprintf函数中添加逗号

时间:2017-11-07 18:57:23

标签: c++ c

我在看主题:How to format a number from 1123456789 to 1,123,456,789 in C?

所以我根据现有代码安装了我的代码。

void printfcomma(char *buf, const char* text int n) {
    if (n < 1000) {
        sprintf(buf, "%s %d", text, n);
        return;
    }
    printfcomma(buf, n / 1000);
    sprintf(buf, "%s ,%03d", text, n %1000);
    return;
}

sprintf只返回最后3位数字。示例:,536

有没有人知道为什么他们没有显示其他数字

2 个答案:

答案 0 :(得分:1)

你正在覆盖。

你应该sprintf(s+ strlen(s),"abcde");

void printfcomma(char *buf,int n) {
    if (n < 1000) {
        sprintf(buf+strlen(buf), "%d", n);
        return;
    }
    printfcomma(buf, n / 1000);
    sprintf(buf+strlen(buf), ",%03d", n %1000);
    return;
}

调用函数

memset(s,0,sizeof(s));// s is the char array.
printfcomma(s,100000536);

输出

100,000,536

答案 1 :(得分:0)

正如@coderredoc所述,代码覆盖了buf

调用strlen()的替代方法是利用sprintf()的返回值。

  

sprintf函数返回写入数组的字符数,不计算终止空字符,如果发生编码错误,则返回负值。 C11dr§7.21.6.63

此外:代码也应处理负数。

const char* text使用尚不清楚。下面的示例代码不使用它。

int printfcomma(char *buf, int n) {
  if (n > -1000 && n < 1000) { // avoid (abs(n) < 1000) here.  abs(INT_MIN) is a problem
    return sprintf(buf, "%d", n);
  }

  int len = printfcomma(buf, n / 1000);
  if (len > 0) {
    len += sprintf(buf + len, ",%03d", text, abs(n % 1000));  // do not print `-`
  } 
  return len;
}

用法

char s[sizeof(int)*CHAR_BIT]; // Somehow, insure buffer size is sufficient.
printfcomma(s, INT_MIN);
puts(s); --> -2,147,483,648