반응형

strtol 함수를 사용하면 진법으로 표기된 문자열을 정수로 변환시켜준다.

strtol 함수는 stdlib.h 헤더 파일에 선언되어 있다.

 

strtol(문자열, 끝포인터, 진법); 으로 사용된다.

 

 

strtol(s1, NULL, 16); 에서 16은 16진법으로 표기된 문자열을 정수로 변환해준다.

16대신에 10을 넣어주면 10진법으로 표기된 문자열을 정수로 변환할 수 있다.

 

두번째 인수 NULL 은 여러 개의 정수로 된 문자열을 변환할 때 사용한다.

처음에는 num1 = strtol(s1, &end, 16);와 같이 s1의 첫 부분을 정수로 변환한다.

여기서 끝 포인터는 &end처럼 end의 메모리 주소를 넣어준다.

이렇게 하면 strtol 함수가 실행된 뒤에는 끝 포인터가 " 12 0x11C 7561"처럼 이전 숫자의 끝 부분부터 시작하게 된다.

 

두번째부터는 num2 = strtol(end, &end, 10);와 같이 end를 넣어주어 이전 숫자의 끝 부분부터 변환하면 된다.

더 변환할 문자열이 없다면 num4 = strtol(end, NULL, 10);와 같이 NULL을 넣어주면 됨.

반응형
반응형

atoi 함수를 사용하면 10진법으로 표기된 문자열을 정수로 바꿀 수 있다.

atoi 함수는 stdlib.h 헤더 파일에 선언되어 있다.

 

사용방법은

atoi(문자열); 이다.

int atoi(char const *_string);

 

성공하면 변환된 정수를 반환해주고, 실패하면 0을 반환 해준다.

 

 

문자열은 정수로 되어있어야 하며 알파벳, 특수 문자가 포함되면

해당 문자부터는 반환을 하지 않는다.

 

 

처음부터 숫자가 아니면 0으로 반환된다.

 

반응형
반응형

strtok는 문자열을 자르는 함수이다.

문자열 자르기는 포인터를 이용하는 방식이다.

 

strtok : 문자열을 조각(token)으로 나누다. / (string tokenize)에서 따왔다.

 

strtok는 string.h 헤더 파일에 포함되어 있음

 

strtok는 보안경고가 발생하니 SDL 검사를 꺼줘야 한다.

 

char *ptr = strtok(s1, " "); 부분에서 " "(공백)을 기준으로 잘라준다.

 

strtok는 잘린 문자를 한번에 얻을 수 없으므로 while 반복문을 사용하여

NULL 문자열이 나올 때 까지 반복해준다.

 

 

char s1[30]

1. The 와 Little 사이에 " "를 NULL 문자로 채워준다.

2. 처음 호출 되는 strtok는 첫 부분 The를 자름 / The의 포인터를 반환

3. while 반복문 안에서 strtok에 NULL을 넣어 잘린 문자열 만큼 다음 문자로 이동해준다.

4 Little 과 Prince 사이에 " "를 NULL 문자를 채워준다.

5. Little 의 포인터를 반환한다.

6. strtok에 NULL을 넣어 잘린 문자열 만큼 다음 문자로 이동한다.

7. Prince 뒤에는 이미 NULL 문자가 있으므로 바꾸지 않는다.

8. Prince 의 포인터를 반환한다.

9. strtok에 NULL을 넣어 잘린 문자열 만큼 다음 문자로 이동한다.

10. 직전 strtok에서 공백 문자를 만나지 못했으므로 NULL을 반환하고 while 반복문을 끝낸다.

반응형
반응형

void가 아닌 함수에서의 반환 값이 없다는 것은 코드 자체를 잘못 짠 것이다. 

그런 코드는 이상하게 작동할 수 있다.

 

 

이 코드는 사용자가 yes를 입력했다면 "긍정적인 답변" 이 출력되고, no를 입력했다면 "부정적인 답변"이라고 출력되게 하는 코드이다.

조건은 get_response 함수에서 yes면 1을 반환하고 no면 0을 반환하도록 하는 것이 조건이다.

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
#include <stdio.h>
#include <string.h>
int get_response(char* prompt);
int main(void)
{
    char a[5= "";
    
    gets_s(a, sizeof(a));
    int b = get_response(a);
    if (b == 1)
    {
        printf("긍정적인 답변");
    }
    else if (b == 0)
    {
        printf("부정적인 답변");
    }
    else
    {
        return 0;
    }
    return 0;
}
int get_response(char* prompt)
{
    char a[] = "yes";
    char b[] = "no";
 
    if (strcmp(prompt, a) == 0)
    {
        return 1;
    }
    else if (strcmp(prompt, b) == 0)
    {
        return 0;
    }
}
cs

이런식으로 코드를 짰다면 get_response 함수에서 사용자가 yes나 no말고 다른것을 입력했을 때

반환 값이 없다.     // 잘못 짠 코드

 

이런식의 코드는 실행은 되는데 이상하게 작동했다.

예를들어 y만 입력해도 "긍정적인 답변" 이라고 나오고 nod 이런식으로 입력해도 "긍정적인 답변" 이라고 나온다.

 

그래서 get_response 함수에서 else 를 하나 추가해줬다.

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
#include <stdio.h>
#include <string.h>
int get_response(char* prompt);
int main(void)
{
    char a[5= "";
    
    gets_s(a, sizeof(a));
    int b = get_response(a);
    if (b == 1)
    {
        printf("긍정적인 답변");
    }
    else if (b == 0)
    {
        printf("부정적인 답변");
    }
    else
    {
        return 0;
    }
    return 0;
}
int get_response(char* prompt)
{
    char a[] = "yes";
    char b[] = "no";
 
    if (strcmp(prompt, a) == 0)
    {
        return 1;
    }
    else if (strcmp(prompt, b) == 0)
    {
        return 0;
    }
    else
    {
        return EOF;
    }
}
cs

else 를 추가해주니 결과가 정상적으로 나온다.

반응형
반응형

a 배열에 test를 넣으면 a의 사이즈는 자동으로 5가 된다.

 

이유는 끝에 \0이 들어가기 때문이다.

t e s t \0

strlen은 \0을 제외하고 string 크기만 찾아준다.

 

결과는 4가 나온다.


컴파일 했을때 오류는 안뜬다.

하지만 실행시키고 test라는 문자를 입력하자마자 오류가 뜬다.

 

왜냐하면 a배열의 사이즈를 지정을 안해줬기 때문에 버퍼의 크기가 0이라 오류가 뜬다.

 

사이즈를 5로 지정해주면 정상적으로 값이 나온다.

t e s t \0

만약 사이즈를 4로 지정해주면 버퍼가 작다고 오류가 뜬다.

왜냐하면 끝에 \0 이 들어갈 자리가 없기 때문이다.

 

반응형
반응형

버블정렬이란?

버블정렬은 배열내의 두개의 인접한 Index를 비교하여 더 큰 숫자를 뒤로 보내 차곡차곡 쌓아 정렬하는 방법이다.

말하자면 배열의 뒷쪽부터 정렬하는 방법이라고 생각하면 된다.

 

 

[소스코드]

오름차순 정렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(void)
{
    int A[5= { 13,2,45,21,50 };
    int tmp;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (A[j] > A[j + 1])
            {
                tmp = A[j];
                A[j] = A[j + 1];
                A[j + 1= tmp;
            }
        }
        printf("%d  ", A[i]);
    }
}
cs

 

 

 

인덱스 0번지와 1번지를 비교해서 0번지가 크다면 temp변수에 1번지 값을 넣어주고, 0번지에 1번지 값을 넣어준다,

그리고 1번지에는 temp변수에 있는 값을 넣어준다.

그 과정을 차례대로 반복한다.

 

 

 

[결과]

 

반응형
반응형

char형 배열에 문자열을 입력 받고 문자열의 길이를 구하여 출력하는 프로그램

 

[결과]

 

 

 

[소스코드1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(void)
{
    char ch[20= "";
    scanf("%s", ch);
    int i = 0;
    int length = 0;
    for (i = 0; ch[i] != '\0'; i++)
    {
        length++;
    }
    printf("문자열%s의 길이는 %d",ch,length);
    return 0;
}
cs

 

[설명]

length 변수를 0으로 초기화 해주고

반복문으로 ch변수의[i]번지 값이 '\0' NULL값이 올때까지 반복시키면서 length를 누적시켜준다.

 

 

 

[소스코드2]

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
int main(void)
{
    char ch[20= "";
    scanf("%s", ch);
    int length = strlen(ch);
    printf("문자열%s의 길이는 %d",ch,length);
    return 0;
}
cs

 

[설명]

string.h 헤더파일을 추가해준다.

length 라는 변수를 만들어주고 strlen(문자열 변수)를 해주면 길이가 나온다.

int length = strlen(ch);

 

 

 


scanf 를 사용해 문자열을 받으면 띄어쓰기 이후의 문자열은 계산을 안한다.

 

왜냐하면 scanf는 space, tab, '\n'을 만나면 입력버퍼에 데이터를 넣는다.

 

scanf 대신에 gets_s(배열명,사이즈); 를 사용해준다.

 

gets_s 는 '\n'을 만날때까지 입력 버퍼에 데이터를 넣는 것을 보류하기 때문이다.

 

 

 

[결과]

 

 

 

[소스코드]

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
int main(void)
{
    char ch[20= "";
    gets_s(ch, sizeof(ch));
    int length = strlen(ch);
    printf("문자열%s의 길이는 %d",ch,length);
    return 0;
}
cs
반응형
반응형

100보다 작은 정수를 입력받아 십의 자리, 일의 자리를 분리하는 프로그램

예를 들어 45를 입력받는다

십의 자리 : 4

일의 자리 : 5

 

 

-소스코드-

 

 

-결과-

 

반응형
반응형

EOF = End Of File 이며, 파일의 끝을 표현하기 위해 정의해 놓은 상수이다(-1 값을 가지고있다).

 

 

함수 호출의 실패나, 윈도우에서 ctrl + z , 리눅스에서 ctrl + d를 입력 했을 경우 EOF를 반환한다.

 

 

 

[예제]

 

 

 

 

[결과]

ctrl + z 를 눌러주고 확인을 해주면 프로그램을 끝낸다.

반응형
반응형

cm로 된 키를 입력받아 피트와 인치로 변환하는 프로그램

 

1피트는 12인치

1인치는 2.54cm

 

 

-소스코드-

 

 

-결과-

 

반응형

+ Recent posts