【问题标题】:Convert an integer to a fixed-length character array in C++在 C++ 中将整数转换为固定长度的字符数组
【发布时间】:2012-02-23 11:58:41
【问题描述】:

我有一个整数x,其中包含一个 1-4 位数字。如何将其转换为 4 个字符的数字数组(必要时用零填充)?也就是说,如果x4,我希望字符数组y 包含0004

【问题讨论】:

  • 完成这个家庭作业最多需要大约 10 行代码。祝你好运!
  • 哇@MichaelMrozek,这是一个非常激进的编辑(虽然它使问题更清楚,但我认为 S.O. 不赞成这样的激进编辑)。
  • @MichaelDautermann:不,鼓励任何使问题更清晰或更有用的编辑。
  • @CodyGray:在合理范围内。如果问题更清楚,但不再意味着同一件事,那就不好了。所以你必须有足够的信心,你已经理解了发帖人的意图。
  • @ruakh:当然,我想。除非问题危险地接近关闭,在这种情况下,鼓励进行任何编辑以挽救问题(如果可能)。这反映了该站点的更大目标,即作为有用的专家级信息的存储库,而不仅仅是让人们回答问题的东西。您获得好答案的能力与您提出好问题的能力直接相关。如果您没有提出一个好的问题,而其他人将您的问题变成一个不能准确反映您意图的好问题,那么这对网站有好处,抱歉。

标签: c++ arrays char int


【解决方案1】:
// Assume x is in the correct range (0 <= x <= 9999)
char target[5];
sprintf(target, "%04d", x);

【讨论】:

  • 可能是 OP 想要的,所以 +1,但它实际上并不是 OP 所要求的。 OP 要求的是char y[4] = {x / 1000, x / 100 % 10, x / 10 % 10, x % 10};。我认为值得明确指出这种差异,以防万一。
  • 这种假设(在您的第一行中)迟早会导致程序崩溃。
  • @James - 我也没有'main',所以它甚至不会运行。如果我尝试编写一个完整的程序,我会添加一个检查,但我只是为了回答这个问题。我陈述了这个假设,以便 OP 知道我的代码是这样假设的。
  • @ruakh - 为什么不是 OP 要求的?这是两个有效的答案。
  • @Asaf:因为 OP 指定(例如){0; 0; 0; 4},而不是 {'0'; '0'; '0'; '4'}。虽然我认为这两种情况下的语法都被破坏了。
【解决方案2】:

好吧,如果你保证向量中只有 4 个元素,我认为你可以使用以下方法:

  char result[4];
  for(int i=0;i<4;++i)
  {
    result[3-i] = (value % 10);
    value /= 10; 
  }

【讨论】:

  • 我会这样做,但我会使用 const 作为数组大小来摆脱神奇的数字。
  • 同意,我只是在输入一些又快又脏的东西。
【解决方案3】:

试试

char y[5];
sprintf(y, "%4d", x);

【讨论】:

  • 这绝对不是 C++,也不安全,因为这样写时可能会溢出缓冲区(如果 x 超过 4 位,如 1000000)。为避免溢出,您需要 snprintf() 并确保 buf 以 null 终止 buf[sizeof(buf) / sizeof(buf[0])] = '\0';
【解决方案4】:

数字的逻辑作用是什么?通常,您会定义一个 名称基于逻辑角色的操纵器,并使用它。可能是 类似于:

class serialno
{
    int myWidth;
public:
    serialno( int width ) : myWidth( width ) {}
    friend std::ostream& operator<<(
        std::ostream& stream, serialno const& manip )
    {
        stream.fill( '0' );
        stream.width( myWidth );
        return stream;
    }
};

然后你可以写:

std::cout << serialno( 4 ) << myNumber;

(更好的实现方式是保存流的格式化状态, 并在析构函数中恢复它,在完整结束时调用 表达。)

当然,要将其放入字符数组中,您可以使用 std::ostringstream 而不是 std::cout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多