整数长度未知时保留前导零

Keep leading zeros when integer length is unknown

以下程序反转用户输入。但是,对于尾随零的数字,打印反转数字时零为 'ignored'。

#include<stdio.h>

int main(void)
{
   int n, reversedNumber = 0, remainder;

    printf("Enter an integer: ");
    scanf("%d", &n);

    while(n != 0)
    {
        remainder = n%10;
        reversedNumber = reversedNumber*10 + remainder;
        n /= 10;
    }

    printf("Reversed Number = %d\n", reversedNumber);

    return 0; 
}

由于用户输入的整数长度未知,我们如何打印所有尾随零,例如:

Enter an Integer: 3000 
Reversed Number = 0003

integer length is unknown

不是。 :-)

计算迭代次数并将其作为宽度传递给对printf的最终调用。

#include<stdio.h>

int main(void)
{
   int n, reversedNumber = 0, remainder;

   printf("Enter an integer: ");
   scanf("%d", &n);

   {
     size_t i = (0 > n);

     while (n != 0)
     {
       remainder = n % 10;
       reversedNumber = reversedNumber * 10 + remainder;
       n /= 10;
       ++i;
     }

     printf("Reversed Number = %0*d\n", (int) i, reversedNumber); /* Alternatively
                                            to the cast you can define i as int. */
   }

   return 0; 
}

来自the documentation

4 Each conversion specification is introduced by the character %. After the %, the following appear in sequence:

[...]

  • An optional minimum field width. If the converted value has fewer characters than the field width, it is padded with spaces (by default) on the left (or right, if the left adjustment flag, described later, has been given) to the field width. The field width takes the form of an asterisk * (described later) or a nonnegative decimal integer.[...])

[...]

5 As noted above, a field width [...] may be indicated by an asterisk. In this case, an int argument supplies the field width or precision. The arguments specifying field width [...] shall appear (in that order) before the argument (if any) to be converted.

[...]

你应该为此使用 char array(string),因为它的一般数学规则我们没有考虑左边的零

#include <stdio.h>
#include <string.h>
int main(){
    char value[]="3000";
    printf(" Number : %s ",value);
    char *rev=strrev(value);
    printf("Reversed Number = %s ",rev);
    return 0;
}

Since the integer length of the user input is unknown, how can we print all the trailing zeros?

整数文本长度可以知道。使用 "%n" 记录到该点的扫描偏移量。


要以数字方式反转字符串(显然可以进行简单的文本反转),记录输入的长度。

打印时,确保使用 "%0*u".

根据需要预先添加前导零
int main(void) {
  int start, end;
  unsigned n;        // I prefer unsigned here, but could use int and %d below.
  printf("Enter an integer: ");
  fflush(stdout);
  //         v--- Consume leading white-space
  if (scanf(" %n%u%n", &start, &n, &end) == 1) {
    int length = end - start;
    unsigned reversedNumber = 0;
    for (int i = length; i > 0; i--) {
      unsigned remainder = n % 10;
      reversedNumber = reversedNumber * 10 + remainder;
      n /= 10;
    }
    printf("Reversed Number = %0*u\n", length, reversedNumber);
  }
  return 0;
}

样本运行

Enter an integer: 00123000
Reversed Number = 00032100

因为最终 objective 是为了 "add the digits of the original number starting from the second-to-last digit of the original number" 为什么要使用字符(字符串)——只使用数字。

如果我正确理解你的问题:

/* test.c sum the digits of a number -- except for the last digit */

#include <stdio.h>

int main (void)
{
    int number;
    printf ("\nenter a number: ");
    scanf ("%i", &number);

    // power = multiple of 10 matching left-most digit in number
    // power is also a loop counter of sorts
    int power = 1;
    while ( number / power > 9 ) 
        power *= 10;    

    // process each digit moving from left to right across number
    // addition is commutative (order of digits does not affect result)

    int sum = 0;
    do {
        int digit = number / power;

        if ( power != 1 )           // skip last digit in number
            sum += digit;    

        number %= power;            // drop left-most digit from number
        power /= 10;                // adjust multiple of 10
    }
    while ( power > 0 );

    printf ("sum (skipping last digit) = %i\n", sum);

    return 0;
}