C 언어 형식으로 숫자를에서 1123456789까지 어떻게 할 수 1,123,456,789있습니까? 나는 사용해 printf("%'10d\n", 1123456789);보았지만 작동하지 않습니다.
조언 해 주시겠습니까? 솔루션이 간단할수록 좋습니다.
C 언어 형식으로 숫자를에서 1123456789까지 어떻게 할 수 1,123,456,789있습니까? 나는 사용해 printf("%'10d\n", 1123456789);보았지만 작동하지 않습니다.
조언 해 주시겠습니까? 솔루션이 간단할수록 좋습니다.
LC_NUMERIC. 그러나 어떤 로케일이 이것을 지원하는지 모르겠습니다.
LC_NUMERIC로케일을 현재로 설정하면 Mac과 방금 확인한 Linux 시스템 ""에서 '작동합니다.
printf()함수 계열의 POSIX 2008 (2013) 버전은 '십진수 형식화 변환 사양과 함께 (작은 따옴표 또는 아포스트로피) 문자 사용을 표준화 하여 숫자가 천 단위 구분 기호로 형식화되어야 함을 지정합니다.
"C"로케일에서 비 화폐 천 단위 구분 기호는 정의되지 않으므로 로케일 "%'d"에서 쉼표를 생성하지 않습니다 "C". 천 단위가 아닌 적절한 구분 기호를 사용하여 로케일을 설정해야합니다. 종종 setlocale(LC_ALL, "");작업을 수행합니다. 로케일 이름에 대한 다른 값 (빈 문자열 제외)이 구현으로 정의됩니다.
답변:
printf가 '(POSIX 2008에서 요구하는대로) 플래그를 지원한다면 printf(), 당신의 로케일을 적절하게 설정함으로써 가능할 것입니다. 예:
#include <stdio.h>
#include <locale.h>
int main(void)
{
setlocale(LC_NUMERIC, "");
printf("%'d\n", 1123456789);
return 0;
}
그리고 빌드 및 실행 :
$ ./example
1,123,456,789
Mac OS X 및 Linux (Ubuntu 10.10)에서 테스트되었습니다.
sprintf()임베디드 시스템에서 당신이 말한대로, 그것은 '플래그를 지원하지 않기 때문에 그것은 분명히 (일을하지 않습니다.
'. 헤더에서 : Copyright ... 2007 Joerg Wunsch ... 1993 Regents of the University of California즉 BSD 파생물.
다음과 같이 재귀 적으로 수행 할 수 있습니다 ( INT_MIN2의 보수를 사용하는 경우이를 관리하려면 추가 코드가 필요합니다).
void printfcomma2 (int n) {
if (n < 1000) {
printf ("%d", n);
return;
}
printfcomma2 (n/1000);
printf (",%03d", n%1000);
}
void printfcomma (int n) {
if (n < 0) {
printf ("-");
n = -n;
}
printfcomma2 (n);
}
요약 :
printfcomma는 정수로 호출합니다. 음수의 특수한 경우는 단순히 "-"를 인쇄하고 숫자를 양수로 만들어 처리합니다 (이는에서 작동하지 않는 비트입니다 INT_MIN).printfcomma21,000 미만의 숫자 만 인쇄되고 반환됩니다.모든 수준 에서 음수를 검사 할 때 불필요한 처리를 수행하지만 더 간결한 버전도 있습니다 (제한된 수의 재귀 수준을 고려할 때 중요하지 않음). 이것은 테스트를위한 완전한 프로그램입니다.
#include <stdio.h>
void printfcomma (int n) {
if (n < 0) {
printf ("-");
printfcomma (-n);
return;
}
if (n < 1000) {
printf ("%d", n);
return;
}
printfcomma (n/1000);
printf (",%03d", n%1000);
}
int main (void) {
int x[] = {-1234567890, -123456, -12345, -1000, -999, -1,
0, 1, 999, 1000, 12345, 123456, 1234567890};
int *px = x;
while (px != &(x[sizeof(x)/sizeof(*x)])) {
printf ("%-15d: ", *px);
printfcomma (*px);
printf ("\n");
px++;
}
return 0;
}
출력은 다음과 같습니다.
-1234567890 : -1,234,567,890
-123456 : -123,456
-12345 : -12,345
-1000 : -1,000
-999 : -999
-1 : -1
0 : 0
1 : 1
999 : 999
1000 : 1,000
12345 : 12,345
123456 : 123,456
1234567890 : 1,234,567,890
재귀를 신뢰하지 않는 사람들을위한 반복적 인 솔루션 (재귀의 유일한 문제는 스택 공간이되는 경향이 있지만 64 비트 정수의 경우에도 몇 수준 만 깊기 때문에 여기서는 문제가되지 않습니다) :
void printfcomma (int n) {
int n2 = 0;
int scale = 1;
if (n < 0) {
printf ("-");
n = -n;
}
while (n >= 1000) {
n2 = n2 + scale * (n % 1000);
n /= 1000;
scale *= 1000;
}
printf ("%d", n);
while (scale != 1) {
scale /= 1000;
n = n2 / scale;
n2 = n2 % scale;
printf (",%03d", n);
}
}
이 두 생성 2,147,483,647을 위해 INT_MAX.
위의 모든 코드는 3 자리 그룹을 쉼표로 구분하기위한 것이지만 공백과 같은 다른 문자도 사용할 수 있습니다.
void printfspace2 (int n) {
if (n < 1000) {
printf ("%d", n);
return;
}
printfspace2 (n/1000);
printf (" %03d", n%1000);
}
void printfspace (int n) {
if (n < 0) {
printf ("-");
n = -n;
}
printfspace2 (n);
}
n에 printfcomma. 부정하기 전에 unsigned 변환을 강제해야합니다.
printf.
다음은 매우 간단한 구현입니다. 이 함수는 오류 검사를 포함 하지 않으며 버퍼 크기는 호출자가 확인해야합니다. 음수에도 작동하지 않습니다. 이러한 개선 사항은 독자를위한 연습으로 남겨집니다.
void format_commas(int n, char *out)
{
int c;
char buf[20];
char *p;
sprintf(buf, "%d", n);
c = 2 - strlen(buf) % 3;
for (p = buf; *p != 0; p++) {
*out++ = *p;
if (c == 1) {
*out++ = ',';
}
c = (c + 1) % 3;
}
*--out = 0;
}
Egads! 저는 리눅스에서 gcc / g ++와 glibc를 사용하여 항상이 작업을 수행합니다. 그렇습니다. '연산자는 비표준 일 수 있지만 단순함이 마음에 듭니다.
#include <stdio.h>
#include <locale.h>
int main()
{
int bignum=12345678;
setlocale(LC_ALL,"");
printf("Big number: %'d\n",bignum);
return 0;
}
다음의 출력을 제공합니다.
큰 숫자 : 12,345,678
거기에있는 'setlocale'호출을 기억해야합니다. 그렇지 않으면 아무것도 형식화하지 않습니다.
'플래그를 지원 하지 않으면 원하는 출력을 얻지 못하며 컴파일러와 무관합니다. 컴파일러는에 대한 라이브러리 함수 printf()가 형식 문자열로 호출 되는지 확인 합니다. 그것을 해석하는 것은 라이브러리 함수에 달려 있습니다. Windows에서는 CRT 라이브러리가 필요한 지원을 제공하지 않을 수 있으며 사용하는 컴파일러는 중요하지 않습니다.
로케일 인식 버전이 흥미로울 것입니다.
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <limits.h>
static int next_group(char const **grouping) {
if ((*grouping)[1] == CHAR_MAX)
return 0;
if ((*grouping)[1] != '\0')
++*grouping;
return **grouping;
}
size_t commafmt(char *buf, /* Buffer for formatted string */
int bufsize, /* Size of buffer */
long N) /* Number to convert */
{
int i;
int len = 1;
int posn = 1;
int sign = 1;
char *ptr = buf + bufsize - 1;
struct lconv *fmt_info = localeconv();
char const *tsep = fmt_info->thousands_sep;
char const *group = fmt_info->grouping;
char const *neg = fmt_info->negative_sign;
size_t sep_len = strlen(tsep);
size_t group_len = strlen(group);
size_t neg_len = strlen(neg);
int places = (int)*group;
if (bufsize < 2)
{
ABORT:
*buf = '\0';
return 0;
}
*ptr-- = '\0';
--bufsize;
if (N < 0L)
{
sign = -1;
N = -N;
}
for ( ; len <= bufsize; ++len, ++posn)
{
*ptr-- = (char)((N % 10L) + '0');
if (0L == (N /= 10L))
break;
if (places && (0 == (posn % places)))
{
places = next_group(&group);
for (int i=sep_len; i>0; i--) {
*ptr-- = tsep[i-1];
if (++len >= bufsize)
goto ABORT;
}
}
if (len >= bufsize)
goto ABORT;
}
if (sign < 0)
{
if (len >= bufsize)
goto ABORT;
for (int i=neg_len; i>0; i--) {
*ptr-- = neg[i-1];
if (++len >= bufsize)
goto ABORT;
}
}
memmove(buf, ++ptr, len + 1);
return (size_t)len;
}
#ifdef TEST
#include <stdio.h>
#define elements(x) (sizeof(x)/sizeof(x[0]))
void show(long i) {
char buffer[32];
commafmt(buffer, sizeof(buffer), i);
printf("%s\n", buffer);
commafmt(buffer, sizeof(buffer), -i);
printf("%s\n", buffer);
}
int main() {
long inputs[] = {1, 12, 123, 1234, 12345, 123456, 1234567, 12345678 };
for (int i=0; i<elements(inputs); i++) {
setlocale(LC_ALL, "");
show(inputs[i]);
}
return 0;
}
#endif
이것은 버그가 있습니다 (하지만 상당히 사소하다고 생각하는 버그입니다). 2의 보수 하드웨어에서는 음수를 N = -N;2의 보수에서 동등한 양수로 변환하려고 시도하기 때문에 가장 음수를 올바르게 변환 하지 않습니다. 더 큰 유형으로 승격하십시오. 이 문제를 해결하는 한 가지 방법은 해당하는 서명되지 않은 유형으로 숫자를 승격하는 것입니다 (그러나 다소 사소하지 않습니다).
'여기 -flag을 : stackoverflow.com/q/44523855/2642059는 내가 완벽하게, 더하고 이제 테스트 주소를이 대답을 생각합니다. 그렇다면 나는 그 질문을 속임수로 표시해야한다고 생각한다.
tsep, place_str그리고 neg_str전혀? 님 fmt_info의 회원을 직접 사용하지 않으 시겠습니까?
while (*ptr-- = *neg_str++). 역순으로 음수 문자열 문자를 삽입합니다.
재귀 또는 문자열 처리없이 수학적 접근 방식 :
#include <stdio.h>
#include <math.h>
void print_number( int n )
{
int order_of_magnitude = (n == 0) ? 1 : (int)pow( 10, ((int)floor(log10(abs(n))) / 3) * 3 ) ;
printf( "%d", n / order_of_magnitude ) ;
for( n = abs( n ) % order_of_magnitude, order_of_magnitude /= 1000;
order_of_magnitude > 0;
n %= order_of_magnitude, order_of_magnitude /= 1000 )
{
printf( ",%03d", abs(n / order_of_magnitude) ) ;
}
}
원칙적으로 Pax의 재귀 솔루션과 유사하지만 사전에 크기 순서를 계산하면 재귀를 피할 수 있습니다 (아마도 상당한 비용이 듭니다).
천 단위를 구분하는 데 사용되는 실제 문자는 로케일에 따라 다릅니다.
편집 : 개선 사항은 아래 @Chux의 의견을 참조하십시오.
abs(n)를 fabs(n)방지 하도록 변경 합니다 print_number(INT_MIN).
log10(abs(n))다른 곳이 아닌를위한 것이 었습니다 . 흥미롭게도, 당신의 솔루션에 하나의 변화와 함께 작동 log10(fabs(n))하고 print_number(INT_MIN)있기 때문에의 printf(..., abs(n / order_of_magnitude))수단이되는 n = abs(INT_MIN) % order_of_magnitude부정적 OK입니다. 우리가 INT_MIN에 접속을 제공하는 경우가 printf(..., abs(n / order_of_magnitude))될 수 있습니다 printf(..., n / order_of_magnitude). 하지만 "abs (INT_MIN)"라는 웜으로 작업하는 것은 일반적으로 나쁜 일이라고 생각합니다.
log10(fabs(n)), n = abs(n% order_of_magnitude)하고 printf(",%03d", n/order_of_magnitude). BTW : 솔루션이 좋다고 생각하지 않는 한이 노력을 기울이지 않을 것입니다. INT_MIN에도 UB가 없습니다.
@Greg Hewgill을 기반으로하지만 음수를 고려하여 문자열 크기를 반환합니다.
size_t str_format_int_grouped(char dst[16], int num)
{
char src[16];
char *p_src = src;
char *p_dst = dst;
const char separator = ',';
int num_len, commas;
num_len = sprintf(src, "%d", num);
if (*p_src == '-') {
*p_dst++ = *p_src++;
num_len--;
}
for (commas = 2 - num_len % 3;
*p_src;
commas = (commas + 1) % 3)
{
*p_dst++ = *p_src++;
if (commas == 1) {
*p_dst++ = separator;
}
}
*--p_dst = '\0';
return (size_t)(p_dst - dst);
}
내 대답은 질문의 그림과 똑같은 결과를 형식화하지 않지만 경우에 따라 간단한 한 줄 또는 매크로로 실제 요구 를 충족시킬 수 있습니다 . 필요에 따라 더 많은 천 그룹을 생성하도록 확장 할 수 있습니다.
결과는 다음과 같이 표시됩니다.
Value: 0'000'012'345
코드:
printf("Value: %llu'%03lu'%03lu'%03lu\n", (value / 1000 / 1000 / 1000), (value / 1000 / 1000) % 1000, (value / 1000) % 1000, value % 1000);
'A와 표준 표기법과 동등한 ,세계 (수학적으로, 적어도) 어떤 부분 (들)?
C에서이 작업을 수행하는 실제 간단한 방법은 없습니다. int-to-string 함수를 수정하여 수행합니다.
void format_number(int n, char * out) {
int i;
int digit;
int out_index = 0;
for (i = n; i != 0; i /= 10) {
digit = i % 10;
if ((out_index + 1) % 4 == 0) {
out[out_index++] = ',';
}
out[out_index++] = digit + '0';
}
out[out_index] = '\0';
// then you reverse the out string as it was converted backwards (it's easier that way).
// I'll let you figure that one out.
strrev(out);
}
또 다른 반복 함수
int p(int n) {
if(n < 0) {
printf("-");
n = -n;
}
int a[sizeof(int) * CHAR_BIT / 3] = { 0 };
int *pa = a;
while(n > 0) {
*++pa = n % 1000;
n /= 1000;
}
printf("%d", *pa);
while(pa > a + 1) {
printf(",%03d", *--pa);
}
}
다음은 이러한 종류의 10 진수 형식을 가장 얇고, 크기 및 속도 효율적으로 구현 한 것입니다.
const char *formatNumber (
int value,
char *endOfbuffer,
bool plus)
{
int savedValue;
int charCount;
savedValue = value;
if (unlikely (value < 0))
value = - value;
*--endOfbuffer = 0;
charCount = -1;
do
{
if (unlikely (++charCount == 3))
{
charCount = 0;
*--endOfbuffer = ',';
}
*--endOfbuffer = (char) (value % 10 + '0');
}
while ((value /= 10) != 0);
if (unlikely (savedValue < 0))
*--endOfbuffer = '-';
else if (unlikely (plus))
*--endOfbuffer = '+';
return endOfbuffer;
}
다음과 같이 사용하십시오 :
char buffer[16];
fprintf (stderr, "test : %s.", formatNumber (1234567890, buffer + 16, true));
산출:
test : +1,234,567,890.
몇 가지 장점 :
역순 포맷으로 인해 문자열 버퍼의 끝을 차지하는 함수입니다. 마지막으로 생성 된 문자열 (strrev)을 고려할 필요가 없습니다.
이 함수는 모든 알고리즘에서 사용할 수있는 하나의 문자열을 생성합니다. 끔찍하게 느리고 항상 상황에 따라 달라지는 여러 printf / sprintf 호출에 의존하거나 필요하지 않습니다.
unlikely?
unlikely조건이 참일 가능성이 낮다는 최적화 프로그램에 대한 힌트 일 수 있습니다. 자세한 내용 은 Linux 커널의 likely()/ unlikely()매크로 를 참조하십시오.
음수로 안전한 format_commas :
VS <2015는 snprintf를 구현하지 않으므로 이렇게해야합니다.
#if defined(_WIN32)
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)
#endif
그리고
char* format_commas(int n, char *out)
{
int c;
char buf[100];
char *p;
char* q = out; // Backup pointer for return...
if (n < 0)
{
*out++ = '-';
n = abs(n);
}
snprintf(buf, 100, "%d", n);
c = 2 - strlen(buf) % 3;
for (p = buf; *p != 0; p++) {
*out++ = *p;
if (c == 1) {
*out++ = '\'';
}
c = (c + 1) % 3;
}
*--out = 0;
return q;
}
사용 예 :
size_t currentSize = getCurrentRSS();
size_t peakSize = getPeakRSS();
printf("Current size: %d\n", currentSize);
printf("Peak size: %d\n\n\n", peakSize);
char* szcurrentSize = (char*)malloc(100 * sizeof(char));
char* szpeakSize = (char*)malloc(100 * sizeof(char));
printf("Current size (f): %s\n", format_commas((int)currentSize, szcurrentSize));
printf("Peak size (f): %s\n", format_commas((int)currentSize, szpeakSize));
free(szcurrentSize);
free(szpeakSize);
@paxdiablo 솔루션의 수정 된 버전이지만 WCHAR및 사용 wsprinf:
static WCHAR buffer[10];
static int pos = 0;
void printfcomma(const int &n) {
if (n < 0) {
wsprintf(buffer + pos, TEXT("-"));
pos = lstrlen(buffer);
printfcomma(-n);
return;
}
if (n < 1000) {
wsprintf(buffer + pos, TEXT("%d"), n);
pos = lstrlen(buffer);
return;
}
printfcomma(n / 1000);
wsprintf(buffer + pos, TEXT(",%03d"), n % 1000);
pos = lstrlen(buffer);
}
void my_sprintf(const int &n)
{
pos = 0;
printfcomma(n);
}
저는 C 프로그래밍이 처음입니다. 여기 내 간단한 코드가 있습니다.
int main()
{
// 1223 => 1,223
int n;
int a[10];
printf(" n: ");
scanf_s("%d", &n);
int i = 0;
while (n > 0)
{
int temp = n % 1000;
a[i] = temp;
n /= 1000;
i++;
}
for (int j = i - 1; j >= 0; j--)
{
if (j == 0)
{
printf("%d.", a[j]);
}
else printf("%d,",a[j]);
}
getch();
return 0;
}
#include <stdio.h>
void punt(long long n){
char s[28];
int i = 27;
if(n<0){n=-n; putchar('-');}
do{
s[i--] = n%10 + '0';
if(!(i%4) && n>9)s[i--]='.';
n /= 10;
}while(n);
puts(&s[++i]);
}
int main(){
punt(2134567890);
punt(987);
punt(9876);
punt(-987);
punt(-9876);
punt(-654321);
punt(0);
punt(1000000000);
punt(0x7FFFFFFFFFFFFFFF);
punt(0x8000000000000001); // -max + 1 ...
}
내 솔루션은. 대신, 이것을 변경하는 것은 독자의 책임입니다.
이것은 오래되었고 많은 답변이 있지만 질문은 "쉼표를 추가하는 루틴을 어떻게 작성할 수 있습니까?"가 아니라 "C에서 어떻게 할 수 있습니까?"였습니다. 의견은이 방향을 지적했지만 GCC가있는 Linux 시스템에서는 다음과 같이 작동합니다.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
unsetenv("LC_ALL");
setlocale(LC_NUMERIC, "");
printf("%'lld\n", 3141592653589);
}
이것이 실행되면 다음을 얻습니다.
$ cc -g comma.c -o comma && ./comma
3,141,592,653,589
LC_ALL프로그램을 실행하기 전에 변수를 설정 해제하면 unsetenv필요하지 않습니다.
직접 인쇄하기보다는 직접 비슷한 작업을 수행해야하고 버퍼로 이동해야했습니다. 여기에 제가 생각 해낸 것이 있습니다. 거꾸로 작동합니다.
unsigned int IntegerToCommaString(char *String, unsigned long long Integer)
{
unsigned int Digits = 0, Offset, Loop;
unsigned long long Copy = Integer;
do {
Digits++;
Copy /= 10;
} while (Copy);
Digits = Offset = ((Digits - 1) / 3) + Digits;
String[Offset--] = '\0';
Copy = Integer;
Loop = 0;
do {
String[Offset] = '0' + (Copy % 10);
if (!Offset--)
break;
if (Loop++ % 3 == 2)
String[Offset--] = ',';
Copy /= 10;
} while (1);
return Digits;
}
부호없는 정수용으로 만 설계되었으며 버퍼가 충분히 큰지 확인해야합니다.
또 다른 솔루션은 결과를 int배열 에 저장하여 최대 크기가 7입니다. long long int유형이 9,223,372,036,854,775,807 에서 -9,223,372,036,854,775,807 범위의 숫자를 처리 할 수 있기 때문 입니다. (부호없는 값이 아닙니다).
비 재귀 인쇄 기능
static void printNumber (int numbers[8], int loc, int negative)
{
if (negative)
{
printf("-");
}
if (numbers[1]==-1)//one number
{
printf("%d ", numbers[0]);
}
else
{
printf("%d,", numbers[loc]);
while(loc--)
{
if(loc==0)
{// last number
printf("%03d ", numbers[loc]);
break;
}
else
{ // number in between
printf("%03d,", numbers[loc]);
}
}
}
}
주요 기능 호출
static void getNumWcommas (long long int n, int numbers[8])
{
int i;
int negative=0;
if (n < 0)
{
negative = 1;
n = -n;
}
for(i = 0; i < 7; i++)
{
if (n < 1000)
{
numbers[i] = n;
numbers[i+1] = -1;
break;
}
numbers[i] = n%1000;
n/=1000;
}
printNumber(numbers, i, negative);// non recursive print
}
테스트 출력
-9223372036854775807: -9,223,372,036,854,775,807
-1234567890 : -1,234,567,890
-123456 : -123,456
-12345 : -12,345
-1000 : -1,000
-999 : -999
-1 : -1
0 : 0
1 : 1
999 : 999
1000 : 1,000
12345 : 12,345
123456 : 123,456
1234567890 : 1,234,567,890
9223372036854775807 : 9,223,372,036,854,775,807
main () 함수에서 :
int numberSeparated[8];
long long int number = 1234567890LL;
getNumWcommas(number, numberSeparated);
인쇄가 필요한 모든 것이면 int numberSeparated[8];함수 내부 로 이동 getNumWcommas하여 이렇게 호출하십시오 getNumWcommas(number).
아주 쉽게 할 수 있습니다 ...
//Make sure output buffer is big enough and that input is a valid null terminated string
void pretty_number(const char* input, char * output)
{
int iInputLen = strlen(input);
int iOutputBufferPos = 0;
for(int i = 0; i < iInputLen; i++)
{
if((iInputLen-i) % 3 == 0 && i != 0)
{
output[iOutputBufferPos++] = ',';
}
output[iOutputBufferPos++] = input[i];
}
output[iOutputBufferPos] = '\0';
}
통화 예 :
char szBuffer[512];
pretty_number("1234567", szBuffer);
//strcmp(szBuffer, "1,234,567") == 0
void printfcomma ( long long unsigned int n)
{
char nstring[100];
int m;
int ptr;
int i,j;
sprintf(nstring,"%llu",n);
m=strlen(nstring);
ptr=m%3;
if (ptr)
{ for (i=0;i<ptr;i++) // print first digits before comma
printf("%c", nstring[i]);
printf(",");
}
j=0;
for (i=ptr;i<m;i++) // print the rest inserting commas
{
printf("%c",nstring[i]);
j++;
if (j%3==0)
if(i<(m-1)) printf(",");
}
}
,아래의 숫자에 대한 추가 인쇄, 날아갈 곳 을 100사용 printf()하고 putchar(), 오해의 소지가있는 이름, 혼란스러운 들여 쓰기 및 너무 많은 코드를 사용합니다.
// separate thousands
int digit;
int idx = 0;
static char buffer[32];
char* p = &buffer[32];
*--p = '\0';
for (int i = fCounter; i != 0; i /= 10)
{
digit = i % 10;
if ((p - buffer) % 4 == 0)
*--p = ' ';
*--p = digit + '0';
}
idx는 갈 수 있습니다. 코드는 0에 대해 아무것도 생성하지 않습니다. 음수를 처리하지 않습니다. 변수 를 만들어야 buffer하는 명백한 이유가 없습니다 static(코드의 재진입을 제한 함). 그것이 무엇을하는지에 대한 설명이 없거나 코드가 완료된 후로 가리키는 p문자열에 형식이 지정된 문자열이 포함되어 있다고 언급하지 않습니다 . 가장 심각한 문제는 천 단위 구분 기호로 쉼표 대신 공백을 사용한다는 것입니다. 하지만 제로를 처리하지 못한다는 사실이 킬러 문제입니다.
printf()형식화 된 IO 함수 제품군에 대한 '수천 구분 기호'플래그 (작은 따옴표 문자 : ')는 일부 라이브러리 구현에서만 지원되는 비표준 플래그입니다. 표준이 아니라는 것이 너무 나쁩니다.