반응형

 


이전에 짯던 것 과 달리, 

이번에는 좀더 큰수를 받아들이기 위하여 unsigned long long을 사용하였다.

또한 file로 출력시켰다. 


또한, 함수를 사용하지 않아 알고리즘의 이해가 필요하다.


16진수를 문자형으로 받은뒤, 문자의 길이를 잰다.

이후 받아온 숫자를 길이 만큼 받는다.

길이만큼 받으면서,각 자릿수마다 16의 제곱을 곱해서 16진수화 시켜준다.

각 자릿수는 position변수가 제어해준다.

각자릿수의 16제곱을 모두 합한뒤 decimal 변수에 저장시켜준다.(10진수로 저장됨)


이후 for문을 이용해

첫번째받은숫자부터 마지막입력받은숫자까지 1씩증가하며

16진수로 출력해준다.


_끝_ 





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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>
 
int main()
{
 
 
 
    char first[20];    // 16진수로 된 문자열
    char last[20];
    unsigned long long decimal = 0
    unsigned long long ldecimal = 0;// 10진수를 저장할 변수
    unsigned long long a=0;
    int i=0;
    char com[5]={0};
    int position = 0;
    int lposition = 0;
 
     FILE *wfp = fopen("output.txt","w");
    //////////////////////////////////////////////////////////////////////////////첫번째////////////////////////////////////////////
    printf("1:");
    scanf("%s",&first);
 
 
    for ( i = strlen(first) - 1; i >= 0; i--)    // 문자열을 역순으로 반복
    {
        char ch = first[i];         // 각 자릿수에 해당하는 문자를 얻음
 
        if (ch >= 48 && ch <= 57)         // 문자가 0~9이면(ASCII 코드 48~57)
        {
            // 문자에서 0에 해당하는 ASCII 코드 값을 빼고
            // 16에 자릿수를 거듭제곱한 값을 곱함
            decimal += (ch - 48* pow(16, position);
        }
        else if (ch >= 65 && ch <= 70)    // 문자가 A~F이면(ASCII 코드 65~70)
        {                                 // 대문자로 된 16진수의 처리
            // 문자에서 (A에 해당하는 ASCII 코드 값 - 10)을 빼고
            // 16에 자릿수를 거듭제곱한 값을 곱함
            decimal += (ch - (65 - 10)) * pow(16, position);
        }
        else if (ch >= 97 && ch <= 102)   // 문자가 a~f이면(ASCII 코드 97~102)
        {                                 // 소문자로 된 16진수의 처리
            // 문자에서 (a에 해당하는 ASCII 코드 값 - 10)을 빼고
            // 16에 자릿수를 거듭제곱한 값을 곱함
            decimal += (ch - (97 - 10)) * pow(16, position);
        }
 
        position++;
    }
 
 //   printf("%llu\n", decimal);    //첫번째수를 정수로 바꾸었을때 값
 
/////////////////////////////////////////////////////////////////////////////두번째////////////////////////////////////////////////////////////
 
    printf("2:");
    scanf("%s",&last);
 
      for ( i = strlen(last) - 1; i >= 0; i--)    // 문자열을 역순으로 반복
    {
        char ch = last[i];         // 각 자릿수에 해당하는 문자를 얻음
 
        if (ch >= 48 && ch <= 57)         // 문자가 0~9이면(ASCII 코드 48~57)
        {
            // 문자에서 0에 해당하는 ASCII 코드 값을 빼고
            // 16에 자릿수를 거듭제곱한 값을 곱함
            ldecimal += (ch - 48* pow(16, lposition);
        }
        else if (ch >= 65 && ch <= 70)    // 문자가 A~F이면(ASCII 코드 65~70)
        {                                 // 대문자로 된 16진수의 처리
            // 문자에서 (A에 해당하는 ASCII 코드 값 - 10)을 빼고
            // 16에 자릿수를 거듭제곱한 값을 곱함
            ldecimal += (ch - (65 - 10)) * pow(16, lposition);
        }
        else if (ch >= 97 && ch <= 102)   // 문자가 a~f이면(ASCII 코드 97~102)
        {                                 // 소문자로 된 16진수의 처리
            // 문자에서 (a에 해당하는 ASCII 코드 값 - 10)을 빼고
            // 16에 자릿수를 거듭제곱한 값을 곱함
            ldecimal += (ch - (97 - 10)) * pow(16, lposition);
        }
 
        lposition++;
    }
 
 //   printf("%llu\n", ldecimal);   //두번째수를 정수로 바꾸었을때 값
 
 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
      printf("3:");
      scanf("%s",&com);
 
     for(a=decimal; a<=ldecimal; a++)
      {
          fprintf(wfp,"%s%llx\n",com,a);
      }
 
 
 
    return 0;
}
cs


반응형

'c언어 > c언어 (진수변환)' 카테고리의 다른 글

c언어[진수변환 함수](file출력)  (0) 2017.10.17
반응형


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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<stdio.h>
#include<stdlib.h>
int main()
{
 
 
     int i=0;
     int a=0;
 
     char com[5= {0};
 
     char start[13]={0};
     char last[13]={0};
 
     char startnumber[7]={0};
     char lastnumber[7={0};
 
     char*ptr;
     long svalue;
     long lvalue;
 
      FILE *wfp = fopen("output.txt","w");
 
     printf("첫번째수:");
     scanf("%s",start);
     printf("마지막수:");
     scanf("%s",last);
     printf("comport :");
     scanf("%s",com);
 
     for(i=0; i<6; i++)
    {
        startnumber[i]=start[6+i]; //startnumber 배열에 뒤에6자 받음
    }
 
     for(i=0; i<6; i++)
    {
        lastnumber[i]=last[6+i]; //startnumber 배열에 뒤에6자 받음
    }
 
    // printf(" 첫번째수 뒤에여섯글자 : %s\n",startnumber); 
    // printf(" 마지막수 뒤에여섯글자 :%s\n",lastnumber); 
     svalue = strtol(startnumber,&ptr,16); //16진수 문자열을 -> 10진수로 변경
     lvalue = strtol(lastnumber,&ptr,16);
 
    // printf("%d\n",svalue);
    // printf("%d\n",lvalue);
 
    // printf("%06x\n",svalue); //10진수를 16진수로 출력
    // printf("%06x\n",lvalue);
 
 
     for(a=svalue; a<=lvalue; a++)
     {
     fprintf(wfp,"%s %06x\n",com,a);
     }
 
 
}
cs

문제

입력 : abcdef000010 시작숫자
   abcdef0000ff 끝숫자
   com1 com숫자

출력 : com1 abcdef000010
   com1 abcdef000011
   com1 abcdef000012
       .
       .
       .
   com1 abcdef0000ff


*출력은 파일로 출력하시오.



여기서 가장 중요했던 함수는 진수변환하는 함수였습니다.
바로 "strtol"
이 함수에 대해 찾아보면
참조사이트 -> (http://forum.falinux.com/zbxe/?mid=C_LIB&page=9&document_srl=408138)

설명

숫자 문자열을 long형 숫자로 변환합니다. atoi()나 atol()과는 달리 (1) 변환하려는 진수를 선택할 수 있으며, (2) 숫자 문자가 아닌 문자를 만나면 그 포인터 위치를 구해 줍니다.

예로, "2007forum.falinux.com" 을 호출하게 되면,

   char   *str;
   char   *ptr;
   long    value;
   str   = "2007forum.falinux.com";
   value = strtol( str, &ptr, 10);
  • value에는 2007이 들어 가고
  • ptr에는 숫자로 변화하지 못하는 문자열의 시작 위치를 구해 줍니다.
    만약 NULL을 넘겨주면 시작 위치를 구하지 않습니다.
헤더stdlib.h
형태long strtol(const char *restrict str, char **endptr, int base);
인수
char *str정수로 변환할 문자열
char **endptr숫자로 변경하지 못하는 문자열의 시작 위치
int base문자열이 가지고 있는 숫자의 진수 (2~32)
반환
long10진 long형 정수 값

예제

#include <stdio.h>
#include <stdlib.h>
int main( void)
{
   char   *str;
   char   *ptr;
   long    value;
   str   = "2007forum.falinux.com";
   value = strtol( str, &ptr, 10);          // 10진수로 변환
   printf( "%s strtol =%ld    str=%s\n", str, value, ptr);
   value = strtol( str, &ptr, 8);           // 8진수로 변환
   printf( "%s strtol =%ld    str=%s\n", str, value, ptr);
   value = strtol( str, &ptr, 16);          // 16진수로 변환
                                            // 2007f까지 숫자로 변환이 됩니다.
   printf( "%s strtol =%ld    str=%s\n", str, value, ptr);
   return 0;
}
]$ ./a.out
2007forum.falinux.com strtol =2007    str=forum.falinux.com
2007forum.falinux.com strtol =1031    str=forum.falinux.com
2007forum.falinux.com strtol =131199    str=orum.falinux.com
strtol 함수는 원하는 진수로 받아서 10진수로 변경시켜주는 함수 입니다.
ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ 
정말 유용합니다.



반응형

'c언어 > c언어 (진수변환)' 카테고리의 다른 글

c언어[진수변환]함수없이 (file출력)  (0) 2017.10.17

+ Recent posts