Cout << işlecini kullanırken int'i baştaki sıfırlarla nasıl doldurabilirim? [çiftleme]


Yanıtlar:


369

Takip ederek,

#include <iomanip>
#include <iostream>

int main()
{
    std::cout << std::setfill('0') << std::setw(5) << 25;
}

çıktı olacak

00025

setfill' 'varsayılan olarak boşluk karakterine ( ) ayarlıdır . setwyazdırılacak alanın genişliğini ayarlar ve hepsi bu kadar.


Genel olarak çıktı akışlarını nasıl biçimlendireceğinizi bilmekle ilgileniyorsanız, başka bir soru için bir cevap yazdım, faydalı olduğunu umuyorum: C ++ Konsol Çıktısını Biçimlendirme.


3
ancak .. nasıl char* or char[]doğrudan konsol için değil bir dizeye biçimlendirilmiş çıktı ( ) yazabilirsiniz . Aslında biçimlendirilmiş dize döndüren bir işlev yazıyorum
shashwat 23:12

12
@harsh use std :: stringstream
cheshirekow

8
bunu yaptıktan sonra akış biçimini geri yüklemeyi unutmayın yoksa daha sonra kötü bir sürpriz elde edersiniz.
Kod Abominator

14
Bu cevap beni doğru yöne çekti ama geliştirilebilir. Bu kodu gerçekten kullanmak için , dosyanızı eklemeniz <iostream>ve <iomanip>en üstüne eklemeniz gerekir ve yazmanız gerekir using namespace std;, ancak bu kötü bir uygulamadır, bu nedenle bunun yerine bu cevaptaki üç tanımlayıcının önüne ön ek eklemeniz gerekir std::.
David Grayson

@shashwat aşağıdaki kodu kullanabilirsiniz - std :: stringstream dosyaadı; filename.fill ( '0'); filename.width (5); Dosya adı << std :: to_string (i)
Prince Patel

45

Bunu başarmanın bir başka yolu da printf()C dilinin eski işlevini kullanmaktır

Bunu şöyle kullanabilirsiniz

int dd = 1, mm = 9, yy = 1;
printf("%02d - %02d - %04d", mm, dd, yy);

Bu 09 - 01 - 0001konsolda yazdırılır .

sprintf()Aşağıdaki gibi bir dizeye biçimlendirilmiş çıktı yazmak için başka bir işlev de kullanabilirsiniz :

int dd = 1, mm = 9, yy = 1;
char s[25];
sprintf(s, "%02d - %02d - %04d", mm, dd, yy);
cout << s;

stdio.hBu işlevlerin her ikisi için de programınıza başlık dosyası eklemeyi unutmayın

Dikkat edilmesi gereken şey:

Boşluğu 0 veya başka bir karakterle doldurabilirsiniz (sayı değil). Biçim belirleyicisi
gibi bir şey yazarsanız %24d, bu 2boşlukları doldurmaz . Bu, alanı 24boşluğa ayarlar ve boşlukları doldurur.


10
Bunun eski bir cevap olduğunu biliyorum, ancak yine de yazması gereken tamponun uzunluğunu belirleyemediğiniz için sprintf'e genellikle çok güvenilmemesi gerektiğine dikkat edilmelidir. Snprintf kullanımı daha güvenli olma eğilimindedir. * Printf () yerine akışları kullanmak da çok daha güvenlidir çünkü derleyici derleme sırasında parametrelerin türlerini kontrol etme şansına sahiptir; AraK'nın kabul edilen cevabı hem tip güvenli hem de "standart" C ++ 'dır ve global isim alanını zehirleyen başlıklara dayanmaz.
Magnus

Cevap tarih biçimlendirmesini örnek olarak kullanmaktır. Bununla birlikte, yüzeyde ISO_8601'e benzemesine rağmen, örnek olarak egzotik bir zaman biçimi kullandığını unutmayın ( en.wikipedia.org/wiki/ISO_8601 ).
varepsilon

31
cout.fill('*');
cout << -12345 << endl; // print default value with no field width
cout << setw(10) << -12345 << endl; // print default with field width
cout << setw(10) << left << -12345 << endl; // print left justified
cout << setw(10) << right << -12345 << endl; // print right justified
cout << setw(10) << internal << -12345 << endl; // print internally justified

Bu çıktıyı üretir:

-12345
****-12345
-12345****
****-12345
-****12345

18
cout.fill( '0' );    
cout.width( 3 );
cout << value;

ancak .. nasıl char* or char[]doğrudan konsol için değil bir dizeye biçimlendirilmiş çıktı ( ) yazabilirsiniz . Aslında biçimlendirilmiş dize döndüren bir işlev yazıyorum
shashwat

2
@Shashwat Tripathi Kullanımı std::stringstream.
AraK

@AraK Sanırım bu Turbo C ++ ile çalışmayacak. Ben kullanarak kullanılır sprintf(s, "%02d-%02d-%04d", dd, mm, yy);nerede solduğunu char*ve dd, mm, yyvardır inttip. Bu, 02-02-1999değişkenlerdeki değerlere göre format yazacaktır .
shashwat

3

C ++ 20'de şunları yapabilirsiniz:

std :: cout << std :: format ("{: 03}", 25); // 025 yazdırır

1

Aşağıdaki işlevi kullanırdım. Sevmiyorum sprintf; istediğimi yapmaz !!

#define hexchar(x)    ((((x)&0x0F)>9)?((x)+'A'-10):((x)+'0'))
typedef signed long long   Int64;

// Special printf for numbers only
// See formatting information below.
//
//    Print the number "n" in the given "base"
//    using exactly "numDigits".
//    Print +/- if signed flag "isSigned" is TRUE.
//    Use the character specified in "padchar" to pad extra characters.
//
//    Examples:
//    sprintfNum(pszBuffer, 6, 10, 6,  TRUE, ' ',   1234);  -->  " +1234"
//    sprintfNum(pszBuffer, 6, 10, 6, FALSE, '0',   1234);  -->  "001234"
//    sprintfNum(pszBuffer, 6, 16, 6, FALSE, '.', 0x5AA5);  -->  "..5AA5"
void sprintfNum(char *pszBuffer, int size, char base, char numDigits, char isSigned, char padchar, Int64 n)
{
    char *ptr = pszBuffer;

    if (!pszBuffer)
    {
        return;
    }

    char *p, buf[32];
    unsigned long long x;
    unsigned char count;

    // Prepare negative number
    if (isSigned && (n < 0))
    {
        x = -n;
    }
    else
    {
        x = n;
    }

    // Set up small string buffer
    count = (numDigits-1) - (isSigned?1:0);
    p = buf + sizeof (buf);
    *--p = '\0';

    // Force calculation of first digit
    // (to prevent zero from not printing at all!!!)
    *--p = (char)hexchar(x%base);
    x = x / base;

    // Calculate remaining digits
    while(count--)
    {
        if(x != 0)
        {
            // Calculate next digit
            *--p = (char)hexchar(x%base);
            x /= base;
        }
        else
        {
            // No more digits left, pad out to desired length
            *--p = padchar;
        }
    }

    // Apply signed notation if requested
    if (isSigned)
    {
        if (n < 0)
        {
            *--p = '-';
        }
        else if (n > 0)
        {
            *--p = '+';
        }
        else
        {
            *--p = ' ';
        }
    }

    // Print the string right-justified
    count = numDigits;
    while (count--)
    {
        *ptr++ = *p++;
    }
    return;
}

1

Tek basamaklı değerlerin örneklerinde dolgu karakteri olarak sıfır kullanılarak tarih ve saat çıktısının başka bir örneği: 2017-06-04 18:13:02

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;

int main()
{
    time_t t = time(0);   // Get time now
    struct tm * now = localtime(&t);
    cout.fill('0');
    cout << (now->tm_year + 1900) << '-'
        << setw(2) << (now->tm_mon + 1) << '-'
        << setw(2) << now->tm_mday << ' '
        << setw(2) << now->tm_hour << ':'
        << setw(2) << now->tm_min << ':'
        << setw(2) << now->tm_sec
        << endl;
    return 0;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.