将前导零插入整数

时间:2009-11-10 14:18:58

标签: c arrays struct

我在C中有一个函数,它从一个rtc外设生成一些小时,然后我想在一个struct对象中填充一个数组。数组设置为5位数,但是当数字小于5位时,我需要在前面加零。

有人可以通过简单的方法来实现这一目标吗?

9 个答案:

答案 0 :(得分:12)

char array[5];
snprintf(array, 5, "%05d", number)

答案 1 :(得分:1)

像@Aaron的解决方案一样,在C中执行此操作的唯一方法是将其视为字符而不是数字。当前导零作为值出现时会被忽略,并在出现在代码中时指示八进制常量。

int a = 0000015; // translates to decimal 13.

答案 2 :(得分:1)

一些小例程,如果没有printf()库,可以做你想做的事情。请注意,例程没有办法告诉您传入的int对于传入的缓冲区大小来说太大了 - 我将把这个添加为读者的练习。但是这些对于缓冲区溢出是安全的(除非我在那里留下了一个bug)。

void uint_to_str_leading( char* dst, unsigned int i, size_t size )
{
    char* pCurChar;

    if (size == 0) return;

    pCurChar = dst + size;  // we'll be working the buffer backwards

    *--pCurChar = '\0';   // take this out if you don't want an ASCIIZ output
                          //   but think hard before doing that...

    while (pCurChar != dst) {        
        int digit = i % 10;
        i = i /10;

        *--pCurChar = '0' + digit;
    }

    return;
}


void int_to_str_leading( char* dst, int i, size_t size )
{
    if (size && (i < 0)) {
        *dst++ = '-';
        size -= 1;

        i *= -1;
    }

    uint_to_str_leading( dst, i, size);

    return;
}

请注意,这些例程传递缓冲区大小并以'\ 0'结尾,因此生成的字符串将比您传入的字符少一个字符(所以不要只传递字段大小正在寻找。

如果您不希望终止'\ 0'字符,因为您正在处理未终止的固定char []数组,那么很容易取出那一行终止的代码(但请考虑终止char []数组 - 如果你不这样做,我打赌你会在接下来的6个月内看到至少一个与此有关的错误。)

编辑以回答一些问题:


dst是指向目标缓冲区的指针。调用者负责放置函数生成的字符串,就像标准库函数strcpy()一样。

指针pCurChar是指向生成的下一个数字字符所在位置的指针。它与大多数字符指针的使用方式略有不同,因为算法从缓冲区的末尾开始并向开始移动(这是因为我们从整数的'end'生成数字)。实际上,pCurChar指向缓冲区中的位置,它将放置下一个数字。当算法向缓冲区添加一个数字时,它会在解除引用之前递减指针。表达式:

*--pCurChar = digit;

相当于:

pCurChar = pCurChar-1;  /* move to previous character in buffer */
*pCurChar = digit;

这样做是因为我们完成时间的测试是:

while (pCurChar == dst) {   /* when we get to the start of the buffer we're done */

第二个函数只是一个简单的例程,通过将负数转换为正数并让第一个函数完成所有实际工作来处理有符号的整数,如下所示:

  • 在缓冲区的开头加一个' - '字符,
  • 调整缓冲区指针和大小,
  • 否定数字使其成为正面
  • 将其传递给转换unsigned int的函数以执行实际工作

使用这些功能的一个例子:

char buffer[80];

uint_to_str_leading( buffer, 0, 5); 
printf( "%s\n", buffer);

uint_to_str_leading( buffer, 123, 6); 
printf( "%s\n", buffer);

uint_to_str_leading( buffer, UINT_MAX, 14); 
printf( "%s\n", buffer);

int_to_str_leading( buffer, INT_MAX, 14); 
printf( "%s\n", buffer);

int_to_str_leading( buffer, INT_MIN, 14); 
printf( "%s\n", buffer);

产生:

0000
00123
0004294967295
0002147483647
-002147483648

答案 3 :(得分:0)

在将数字插入数组之前,将数组中的每个元素初始化为0。这样你就可以保证总是有5位带前导零的数字。

答案 4 :(得分:0)

如果类型为int,则为no。将类型设置为字符串?

答案 5 :(得分:0)

试试这个:

    char source[5+1] = { '1','2', 0, 0, 0, 0 };
    char dest[5+1];
    int nd = strlen(source) ;
    memset ( dest, '0', 5 - nd );
    sprintf ( dest+nd+1, "%s", source );

答案 6 :(得分:0)

不是简单的总bzero()或类似的东西然后填充新的价值适合你吗?如果没有,请你详细说明一下吗?

我不是在开玩笑,我已经看过几种情况,总填0为快,然后添加0,特别是如果内存被缓存而bzero()有一些突发写支持。

答案 7 :(得分:0)

int newNumber [5]  = 0;

for ( int i=0; givenNumber != 0 && i < 5 ; i++ ) {
    newNumber[i] = givenNumber%10;
    givenNumber = givenNumer/10;
}

答案 8 :(得分:0)

对缺乏细节表示歉意。我的代码生成一个32位整数,我希望它只能达到5位小数。然后我调用函数:

numArray = numArrayFill(12345, buf, sizeof(buf));

(uint32_t number, char *buffer, int size) 
{
    char *curr = &buffer[size];             
    *--curr = 0;                            
    do 
    {
        *--curr = (number % 10) + '0';
        number /= 10;
    } 
    while (number != 0);

    if (curr == buffer && number != 0)      
    return NULL;

    return curr;
}   

当我输入少于5位的数字并且我得到随机行为时,问题出现了。我需要做的是在前面添加零,这样它总是一个5位数字。

由于 戴夫