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

3
以下程序可以将用户输入的数值反转。但是,对于以零结尾的数字,在打印反转数字时会被“忽略”。
#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

2
将其作为字符串读取并反转该字符串。 - Andrew Henle
我之前已经做过了,也许我需要在问题中添加一些上下文。目标是从原始数字的倒数第二个数字开始添加数字。这意味着将字符串转换回整数将丢失前导零。@AndrewHenle - Dominic Motuka
@daumie,所以你问了如何做某事,但那不是你真正想问的问题?你需要明确地说明你想知道的内容。alk提供的答案恰好回答了所问的问题。 - WhozCraig
3个回答

8

整数长度未知

其实并不是这样。

计算迭代次数,并将其作为宽度传递给最终的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; 
}

来自文档

4 每个转换说明符都由字符%引入。在%之后,以下内容按顺序出现:

[...]

  • 可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则默认情况下会在左侧(或右侧,如果给定了稍后描述的左调整标志)用空格填充到字段宽度。字段宽度采用星号*(稍后将进行描述)或非负十进制整数的形式[...]。

[...]

5 如上所述,字段宽度[...]可以由星号表示。 在这种情况下,int参数提供字段宽度或精度。 指定字段宽度[...]的参数应该(按照顺序)出现在要转换的参数(如果有)之前。

[...]


1
获取: 警告:字段宽度应为“int”类型,但参数为“size_t”(又名“unsigned long”)[-Wformat]而且,我注意到多了一个零,例如3000被反转为00003。 - Dominic Motuka
1
是的,你说得对。我已经纠正并注释了代码。 - alk
1
请查看我对负数的修复。 - alk
太好了!我忽略了负数。现在按预期工作。谢谢。 - Dominic Motuka

2
由于用户输入的整数长度未知,我们如何打印所有尾随零?
整数文本长度是可以知道的。使用"%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

0

你应该使用字符数组(字符串)来处理这个问题,因为这是一条普遍的数学规则我们没有考虑左边的零

#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;
}

strrev() 不是 C 语言的标准函数,而是某些供应商特定的扩展。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接