1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int first;
    int last;
 
    int totarray[10= { 0, };        
 
    printf("Input range(first) : ");
    scanf("%d"&first);
 
    printf("Input range(second) : ");
    scanf("%d"&last);
 
 
    for (int i = first; i <= last; i++)
    {
        //숫자를 문자열로 저장할 배열
        char tmparr[4= { -1, };
 
        //숫자를 하나하나 배열(문자열)에 저장. sprintf 함수는 남은 버퍼(배열)에는 NULL(0x00)을 저장함
        //이상하게 여기서 bof? 가 일어남. totarray[0]이 강제로 0이 됨.
        sprintf(tmparr, "%d", i);
 
 
        for (int j = 0; j < 4; j++)
        {
            int intstring = tmparr[j] - 0x30;
            if (intstring != -48)
            {
                totarray[intstring]++;
            }
        }
    }
 
    for (int i = 1; i < 10; i++)
    {
        printf("%d: %d \n", i, totarray[i]);
    }
    return 0;
}
cs


짠 소스코드는 최대 4자리수 입력받아와서 각 자릿수 숫자들 더해서 배열에 출력하는건데
그냥 sprintf로 배열에 저장해서 그 배열 접근해서 출력하게 간단하게 짰음 ㅇㅇ;;


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=24b0d769e1d32ca73ded84fa11d028310ef2ab22591d9bdbf8feafbf5b5ba2ebeed996f29e0e681cb3d8378fa15b6871a28e36408330160b7883017cd708b455631a




보기만 하면 간단하게 잘 작동될거같은데
26번째 sprintf 함수가 실행되고나면 짤처럼 intstring[0] 가 무조건 0으로 초기화되버림
그래서 일단 해결은 배열크기 11로해서 1번째 인덱스부터 이용해서 해결하긴했는데
이게 sprintf가 bof일어나서 intstring 배열까지 접근해버려서 조작해버리는거임?
아님 내가 모르는 존나개쩌는기술때문에 sprintf의 출력값이 강제로 intstring 배열에 저장되버리는거임?