PHP 샘플코드 - 파일입출력과 문자열 파싱

Posted by ironmask84
2017. 10. 17. 10:21 나는 프로그래머다!/PHP



C언어 버젼에 이어 PHP 버젼으로도 파일입출력과 문자열 파싱 들어갑니다!
http://ironmask.net/392 )

전반적으로 C언어와 비슷한데,

함수가 좀 더 사용성이 좋고, 다양한 느낌이 있습니다.

이용한 함수보다 더 다양하게 제공되는 함수들이 있으니,

간략하게 잘 정리된 블로그를 공유드립니다. ( http://slreference.tistory.com/8 )


주제 요약 설명

PHP 언어로 파일을 읽어와서

특정 키워드 를 포함하는 함수를 통해 값을 얻어오고,

특정 delimiter로 파싱해서 결과물을 얻는 코드 입니다.

주요 사용 함수는 fopen, fgets, parse_strisset, strchr, explode입니다.

프로그래밍 언어의 기본 문법과 함수에 대한 사용법을 어느 정도 숙지하신 것을 

기본 전제로 진행합니다. ^^


샘플 코드

아래 코드는 file을 읽어와서 내장함수 parse_str을 이용한 것입니다.

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
<?php
 
// form을 wifiSet.php로 보내서, 파일 저장
 
include "settings.php";
 
// wifi setting
$fp = fopen("wifisetting.txt""r+");
if (!$fp) {
    die("<br/>Failed to open file.");
    echo "<script> alert('Failed to open file.'); </script>";
}
 
// wifienable=0&networkName=1 형식의 문자열을 wifienable 변수 생성 후 0을 넣어주고, networkName변수 생성 후 1을 넣어주는 함수
parse_str(fgets($fp));
 
// 예외처리는 각 설정에 대한 변수가 있느냐?  isset() 함수 그리고 그 변수에 값이 있느냐?  empty() 함수 <- true/false 반환
// 예외에 걸리면, 보드에서 새로 값 가져오기? or 설정파일 다시 생성??
 
if(isset($wifienable)){    // 예외처리를 위한 $wifienable 변수 존재 여부
    $WIFI_Setting['wifienable'= $wifienable;
}
if(isset($networkName)){
    $WIFI_Setting['networkName'= $networkName;
}
if(isset($channelselect)){
    $WIFI_Setting['channelselect'= $channelselect;
}
 
fclose($fp);
 
?>
cs


아래는 웹에서 접근했을 때 외부프로그램인 윈도우에서 제공하는 ipconfig 명령어를 수행한 결과를

strchr과 explode를 이용해서 문자열을 파싱해서 값을 얻어오는 부분입니다.

1
2
3
4
5
6
7
8
9
10
11
<?php
 
    $data1 = iconv("EUC-KR""UTF-8", shell_exec("ipconfig"));    // ironmask unicode 문제 해결 2017-09-18
    $data1_token1 = strchr($data1"이더넷");  // 전체 문자열에서 '이더넷' 문자열이 나오는 부분부터 끝까지 값 복사
    $data1_token2 = strchr($data1_token1"IPv4 주소 . . . . . . . . . : ");
    $data1_token3 = explode(" "$data1_token2);    // delimiter로 문자열 자르기
    $data1_Ipv4 = explode("."$data1_token3[12]);    // 원하는 문자열 값 얻기
 
    echo $data1_Ipv4[0] . "." . $data1_Ipv4[1] . "." . $data1_Ipv4[2] . "." . $data1_Ipv4[3];  // IPv4 출력
    
?>
cs


아래는 위 소스에서 사용된 파일을 write하는 내용 입니다.

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
<?php
 
$wifienable = $_POST['wifienable']; // Radio Button
 
$networkName = $_POST['networkName'];                // check box
$networkName_count = count($_POST['networkName']);  // check box 에서 체크된 녀석 count
 
$channelselect = $_POST['channelselect']; // Select Button
 
 
$fp = fopen("wifisetting.txt""w+");
if (!$fp) {
    die("<br/>Failed to open file.");
    echo "<script> alert('Failed to open file.'); </script>";
}
fwrite($fp"wifienable=");
fwrite($fp$wifienable."&");
 
fwrite($fp"networkName=");
fwrite($fp$networkName_count."&"); // 우선은, 체크박스가 1개인 경우는 체크되면 1 아니면 0 
 
fwrite($fp"channelselect=");
fwrite($fp$channelselect);
fclose($fp);
 
echo "<script> window.open('wifi.php', '_self', ' '); </script>";
 
?>
cs




'나는 프로그래머다! > PHP' 카테고리의 다른 글

PHP와 Javascript 동작 개념  (0) 2017.10.17
 

C언어 샘플코드 - 파일입출력과 문자열 파싱

Posted by ironmask84
2017. 10. 17. 08:57 컴퓨터공학/C언어 레퍼런스



2년도 전에 타 블로거의 글을 참고해서 문자열함수에 대해 공유 드린적이 있었습니다.
( http://ironmask.net/198 )

내가 아닌 다른 분이  작성한 것을 참고하는 것은 역시 세월이 지나면,

참고할 때의 기억이 잘 안나는 것 같네요 ㅎㅎ

SW개발 업무를 맡고는 있지만 디버깅하는 업무가 많다보니,

코딩을 할 때 원하는 함수나 문법이 생각이 나지 않을 때가 종종 있습니다.

사실 다루는 프로그래밍 언어도 한 개에 국한되지 않으므로 더욱 혼잡함 ㅜㅜ

아무튼 그래서 기회되는 대로 샘플코드 형식으로 기록도 남기고,

방문자분들에게도 좋은 정보를 제공하도록 하겠습니다. :)


주제 요약 설명

C언어로 파일을 읽어와서

특정 키워드와 비교하는 조건문을 통해,

특정 delimiter로 파싱해서 결과물을 얻는 코드 입니다.

주요 사용 함수는 fopen, fgets, strncmp, strtok 입니다.

C언어의 기본 문법과 함수에 대한 사용법을 어느 정도 숙지하신 것을 

기본 전제로 진행합니다. ^^

샘플 코드

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
Start 2017-10-10
By ironmask 
*/
 
int main( int argc, char* argv[] )
{
    
    char* token;
    char* token2;
    
    char strline[100];    // one line sentence
    int i = 0;
    char* word = "iface eth0 inet static"// keyword
    
    FILE *fp = fopen("../../etc/network/interfaces""r+");
    
    if(fp == NULL){
        puts("FAIL");
        return -1;
    }
    
    
    while(fgets(strline, sizeof(strline), fp)) // 한줄을 읽는데 size 만큼 읽는다.
    {     
        // interfaces File 내에 특정 키워드 찾기
        if(strncmp(strline, word, strlen(word) ) == 0)
        {
            // address
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    // 공백을 delimiter 기준으로 자르기
            token = strtok(NULL" "); // 더 이상 문자열이 없으면 NULL을 반환
            token[strlen(token)-1= '\0';    // gets 함수는 마지막에 \n이 들어가므로 이를 제거하기 위해 널값 삽입
            printf("%s\n", token);
            
            // netmask
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    
            token = strtok(NULL" "); 
            token[strlen(token)-1= '\0';
            printf("%s\n", token);
            
            // broadcast
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    
            token = strtok(NULL" "); 
            token[strlen(token)-1= '\0';
            printf("%s\n", token);
                
            // network
            fgets(strline, sizeof(strline), fp);
            
            token = strtok(strline, " ");    
            token = strtok(NULL" "); 
            token[strlen(token)-1= '\0';
            printf("%s\n", token);
            /*
            token2 = strtok(token, ".");
            printf("%s\n", token2);
            token2 = strtok(NULL, "."); 
            printf("%s\n", token2);
            token2 = strtok(NULL, "."); 
            printf("%s\n", token2);
            token2 = strtok(NULL, "."); 
            printf("%s\n", token2);
            */
            
        }    
    
    //    memset( &strline, 0, sizeof(strline) );
    //    printf("hello\n");
    }    
    
    fclose(fp);
    return 0 ;
}
cs


아래는 위 소스에서 사용된 interfaces 파일 내용 입니다.

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
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
 
# The loopback interface
auto lo
iface lo inet loopback
 
# Wireless interfaces
iface wlan0 inet dhcp
        wireless_mode managed
        wireless_essid any
        wpa-driver wext
        wpa-conf /etc/wpa_supplicant.conf
 
iface atml0 inet dhcp
 
# Wired or wireless interfaces
allow-hotplug eth0
auto eth0
iface eth0 inet static
        address 192.168.0.1
        netmask 255.255.255.0
        broadcast 192.168.0.255
        network 192.168.0.0
        up /etc/network/if-up.d/eth0-up.sh
 
allow-hotplug eth1
auto eth1
iface eth1 inet static
        address 10.104.91.15
        netmask 255.255.255.0
        network 10.104.91.0
        gateway 10.104.91.1
        dns-nameserver 156.147.19.132
        up /etc/network/if-up.d/eth1-up-nat.sh
        down /etc/network/if-post-down.d/eth1-down-nat.sh
cs




 

grep 명령어 - 문자열 패턴 검색

Posted by ironmask84
2017. 7. 7. 14:14 나는 프로그래머다!/Linux


Unix/Linux 문자열 패턴 검색 (grep)


  패턴 검색 [grep] 

grep 명령은 파일 내에서 지정한 패턴이나 문자열을 찾은 후에, 그 패턴을 포함하고 있는 모든 행을 표준 출력해 준다. 물론, 한 디렉토리 내에서 지정한 패턴을 포함하는 파일을 출력할 수도 있다. grep 명령은 하나 이상의 파일로부터 프로그램 수정 등을 위해 변수, 또는 함수명을 찾을때 많이 사용된다. 



  grep 명령의 기본 문법 

grep [-옵션] 패턴 파일명 


   옵션

-c : 패턴이 일치하는 행의 수를 출력 

-i : 비교시 대소문자를 구별 안함 

-v : 지정한 패턴과 일치하지 않는 행만 출력 

-n : 행의 번호를 함께 출력 

-l : 패턴이 포함된 파일의 이름을 출력 

-w : 패턴이 전체 단어와 일치하는 행만 출력 


   사용 예 

$ grep -n '삼성' token_dic

= token_dic 이라는 파일내에서 '삼성' 이라는 패턴이 들어간 문자열과 행번호를 출력 


$grep -l '삼성' * 

= 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 파일의 이름을 출력 


$grep -v '삼성' * 

= 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어가지 않은 행을 출력


$grep -r '삼성' * 

= 현재 디렉토리 및 서브디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 문자열 출력



  패턴의 정규 표현식(Regular Expression) 

패턴 지정에서 사용되는 정규 표현식은 작은 따옴표 (' ')로 묶어서 표현한다. 

$ grep '^a' 파일명 

= ^는 파일의 시작을 나타냄. 파일에서 a로 시작하는 행을 찾는다. 

$ grep 'apple$' 파일명

= $는 파일의 끝을 나타냄. 파일에서 e로 끝나는 행을 찾는다. 

grep 'app*' 파일명 

= 파일에서 app로 시작하는 모든 단어를 찾는다. 

$ grep 'a.....e' 파일명 

= 파일에서 a로 시작하고 e로 끝나는 7자리 단어를 찾는다. 

$ grep [a-d] 파일명 

= 파일에서 a,b,c,d 로 시작하는 단어를 모두 찾는다. 

$ grep [aA]pple 파일명 

= 파일에서 apple 또는 Apple로 시작하는 단어를 모두 찾는다.

$ grep 'apple' d*

= d로 시작하는 모든 파일에서 apple 를 포함하는 모든 행을 찾는다. 

$ grep 'apple' 파일명1 파일명2 

= 지정된 두개의 파일에서 apple 를 포함하는 모든 행을 찾는다. 

$ grep '^[ab]' 파일명 

= 파일에서 a나 b로 시작되는 모든 행을 찾는다. 



출처: http://ra2kstar.tistory.com/100 [초보개발자 이야기.]

 

C언어 정리하기 - 문자열과 문자열 함수

Posted by ironmask84
2015. 4. 8. 13:56 컴퓨터공학/C언어 레퍼런스


자료 출처 : http://ruvendix.blog.me/220263134254

컴퓨터와 문자에 대해서 얼마나 알고들 계시나요?


어떤 프로그래밍 언어든지 문자와 문자열을 다루는 것은 매우 중요해요!

문자를 출력하지않는 프로그램은 거의 없죠~

게임에서 문자가 하나도 나오지 않는다고 생각해보세요...


물론 레벨, 경험치, 돈은 출력이 되겠지만 캐릭터의 이름, 퀘스트의 내용, 공지 사항 등 중요한 것들이 나오지 않습니다...

특히 문자는 게임을 한글화할 때 중요하죠~ 게임을 한글화할 때는 단순히 문자를 출력하는게 아니라 기초 지식이 좀 필요합니다.

그 기초 지식을 아는 분과 모르는 분들을 위해서 포스팅을 가르겠습니다.

문자를 다루기 전에 꼭  알아야할 개념이 [문자 집합(Character Set)]입니다.

문자 집합은 말 그대로 문자들이 모인 것을 말하는데 경우에 따라서는 전 세계가 공유하는 문자 집합도 있습니다.

많이들 들어보셨겠지만 [유니코드(Unicode)]가 대표적이죠.


컴퓨터에서 문자를 표현할 때는 그냥 표현하는게 아니라 규칙이 있습니다.

그 규칙에는 SBCS, MBCS, WBCS 등이 있습니다. 하나씩 살펴볼게요.

<SBCS = Single Byte Character Set>

SBCS는 문자를 표현할 때 1바이트만 사용하는 방식을 말합니다.

컴퓨터는 미국에서 발명되었으므로 당연히 사용하던 문자도 영어였죠.

영어는 1바이트만 사용해서 문자를 표현할 수 있습니다.


정확히 말하자면 7비트를 문자 표현으로 사용하고 마지막 최상위 비트를 오류 검사용 비트인 패리티 비트로 사용해요.

SBCS는 미국의 ANSI에서 만든 ASCII가 대표적입니다.

 

ASCII는 정보 교환을 위해 ANSI에서 만든 코드를 말합니다.


ASCII 표를 보면 65부터 90까지가 영어 대문자 알파벳이고 97부터 122까지가 영어 소문자 알파벳입니다.

어떤 프로그래밍 언어를 배우던지 ASCII를 모르면 문자를 다룰때 좀 어려울거에요.

ASCII는 모든 프로그래밍 언어에서 사용이 가능합니다.


비트탕 2개의 데이터를 표현할 수 있으므로 ASCII는 최상위 비트를 제외하고 127개의 데이터를 표현할 수 있지만

최상위 비트까지 사용해서 총 256개의 데이터를 표현하는 확장형 ASCII도 있습니다.


<DBCS = Double Byte Character Set>

SBCS는 치명적인 문제가 있었는데 일부 다른 나라의 언어들을 표현할 수 없다는 점이였습니다.

즉, 1바이트만으로는 한글, 일본어, 중국어 등은 표현할 수 없습니다.

DBCS는 SBCS의 문제를 해결한 문자 집합으로 문자의 표현 크기를 2바이트로 늘렸습니다.

하지만 DBCS도 ASCII를 사용하기 때문에 코드가 중복되는 문제가 발생했습니다.

이 때문에 SBCS와 DBCS 둘 다 사용해야 했습니다...



<MBCS = Multi Byte Character Set>

MBCS는 SBCS와 DBCS를 잘 조합한 문자 집합입니다.


ASCII는 전 세계가 공통으로 사용하고 그 외의 코드들을 한글, 일본어, 중국어 등의 문자로 표현합니다.


자세히 말하자면 ASCII는 0x00부터 0x7F까지니까 여기까지는 전 세계가 공통으로 사용하고


0x80부터는 각 나라마다 따로 사용합니다. 따라서 0x80부터는 각 나라마다 코드가 겹칠 가능성이 높죠.


일본 게임에서 많이 등장하는(미소녀 연애 시뮬레이션, JRPG, 라이트 노벨 게임 등) S-JIS가 대표적입니다.

MBCS는 지금도 사용합니다. 이 때문에 좀 문제가 발생하기도 해요.

문자를 출력할 때 비주얼 스튜디오에서 설정을 좀 바꿔야하는 경우가 있습니다...


MBCS냐 WBCS냐에 따라 문자의 출력 방식이 달라집니다.

이 부분은 잘 알아두세요.

<WBCS = Wide Byte Character Set>

?WBCS는 MBCS를 보완한게 아니라 전 세계가 공통적으로 사용할 수 있도록 만든 문자 집합입니다.


WBCS보단 MBCS가 편한 경우도 많아서 그런지 대부분의 프로그램들이 WBCS를 잘 안쓰죠.


모든 프로그램들이 WBCS를 사용한다면 게임 한글화도 정말 쉬워집니다...

?WBCS는 주로 인터넷에서 사용됩니다. 전 세계가 공통적으로 사용해야할 필요가 있으니까요.


WBCS의 대표가 유니코드입니다. 유니 코드는 모든 문자를 전부 다 2바이트로 표현합니다.

그리고 전 세계 문자를 다 넣으려다보니 용량이 많이 큽니다... 그래서 MBCS를 많이 사용하긴 하죠.?


문자에 대해서 이해할 때는 가장 넓은 개념이 문자 집합이고 그 안에 EUC-KR, S-JIS, 유니코드 등이 있다고 이해해야 됩니다.

그럼 폰트는 뭔가요? 폰트는 문자를 표현하는 방법을 말합니다.

문자에 해당되는 코드는 그대로 유지하고 문자의 크기, 삐침, 굵기, 기울기 등만 변경하는걸 폰트라고 합니다.

한글화를 해봤는데요 문자 코드가 없던데요? 문자를 코드 말고 이미지로 사용하는 방법도 있습니다.

이런걸 고유 폰트라고 하는데 각 이미지를 코드와 연결해서 사용하는 방식입니다.

고유 폰트를 사용하는 게임들은 한글화가 무진장 어렵습니다...

 

문자 집합에 대해서는 이걸 잘 기억하세요.


MBCS에서는 영어가 1바이트이고 다른 대부분의 문자들이 2바이트입니다. (일본어에서 히라가나는 1바이트)


WBCS에서는 모든 문자가 2바이트입니다.


그렇다면 한글은? 한글은 대부분 2바이트로 표현됩니다.


문자열을 다루는 함수를 사용하기 위해서는 먼저 헤더 파일을 포함시켜주세요.

"string.h" 헤더 파일은 문자열을 다루는 함수들이 선언되어 있고


"ctype.h" 헤더 파일은 문자를 판단하는 함수들이 선언되어 있습니다.

제가 사용한 포인터와 배열입니다.


여기서 중요한건 포인터는 문자열의 주소를 가지고 있을뿐 조작하거나 그런건 못합니다.

문자열을 복사 및 결합 및 변환하려면 문자 배열을 사용해야 합니다.


"strlen()" 함수는 종료 문자(\0)를 제외한 문자열의 크기를 알려주는 함수입니다.

한글은 2바이트이고 공백 문자는 1바이트니까 출력은 제대로 나왔군요.

"strcpy()" 함수는 String Copy의 약자로 문자열을 복사하는 함수입니다.

포인터는 작동하지 않으므로 문자 배열을 사용하세요.

첫 번째 인자가 문자열을 저장할 인자고 두 번째 인자가 복사할 문자열입니다.

보안상의 문제로 "strcpy_s()" 함수를 사용했습니다.


"strncpy()" 함수는 "strcpy()" 함수와 비슷합니다.

마지막 인자는 바이트를 나타는데 몇 바이트만큼 복사할지를 설정합니다.



"strcpy()" 함수의 문제를 "strdup()" 함수로 해결할 수도 있습니다.

String Duplication의 약어로 문자열을 복사하는 함수입니다.


다만 문자열을 복사할 때 동적 메모리 할당을 이용해서 문자열의 크기만큼 복사합니다.

동적 메모리 할당을 이용하므로 포인터를 사용해서 주소를 받아야 합니다.?

"strcat()" 함수는 String Concatenation의 약어로 문자열을 붙이는 함수입니다.



"strchr()" 함수와 "strstr()" 함수는 문자열에서 문자와 문자열을 찾는 함수입니다.

약간 사전과 비슷하죠? 사전 프로그램을 만들 때 많이 사용하는 함수입니다.


"strcmp()" 함수는 조건문을 사용할 때 많이 사용하는 함수입니다.

문자열과 문자열을 비교해서 같은지 다른지를 판단합니다.

조건문에 사용하면 문자열을 입력받아 문자열을 검사하는 프로그램을 만들 수 있어요.

문자열1 > 문자열2면 양수를 반환하고

문자열1 == 문자열2면 0을 반환하고

문자열1 < 문자열2면 음수를 반환합니다.


"strupr()" 함수와 "strlwr()" 함수는 영어 알파벳을 대문자 및 소문자로 바꿔주는 함수입니다.

보안상의 이유로 "_strupr_s()" 함수와 "_strlwr_s()" 함수를 사용해야 하지만 이게 더 불안정합니다...

그래서 "_strupr()" 함수와 "_strlwr()" 함수를 사용했습니다.

컴파일하면 경고문이 출력되긴 하지만 무시해도 괜찮아요.

그냥 함수를 새로 만들 수도 있습니다.

ASCII에서 영어 대문자와 소문자의 코드를 이용하면 대소문자 바꾸는건 간단해요.

영어 대문자를 영어 소문자에 해당되는 코드로 바꿔치기하면 간단하죠~



입력한 문자가 무슨 문자인지 잘 판단해주네요~

이 함수들을 자세히 파헤치자면 문자가 맞으면 0이 아닌 값을 반환하고 문자가 틀리면 0을 반환하는 형식입니다.


C언어의 기초를 어느정도 알고나면 후반부는 이런식으로 함수들을 몇 개 소개합니다.


그리고 그 함수들을 싹~다 모은걸 라이브러리라고 하는데 라이브러리는 보통 책에서는 잘 나오지 않죠.


C언어에서 제공하는 함수를 C 라이브러리라고 하는데 정말 많습니다... 그렇다고 다 알 필요는 없고요.

필요할 때 찾아서 사용하면 되는거에요~ 대부분의 프로그래밍이 이런 방식입니다.


머리가 정말 좋다면 모든 함수를 다 외워서 사용하겠지만... 기초 함수들만 알고 있어도 수많은 응용이 가능하답니다.

 


 

C언어 강좌 문자열 배열과 null

Posted by ironmask84
2015. 4. 3. 16:53 컴퓨터공학/C언어 레퍼런스


출처 : http://blog.naver.com/kwy4122?Redirect=Log&logNo=220305490766

■ 배열까지 진도가 나갔네요. ㅎㅎ 혹시 이 글을 가장 먼저 보시는 분들은 배열의 개념에 관련된 내용은 앞쪽 글들 참고하시고요. 여기서는 문자열 배열(char)과 null에 대해서 알아보겠습니다. 


■ C언어 자료형 중에서 char 자료형을 이용하면 문자열 배열을 저장할 수 있고, 변경도 가능합니다. 변경이 가능하다는 건 변수 형태로 문자열 저장이 가능하다는 의미이기도 하겠죠? C언어에서는 문자열을 표현할 때 큰따옴표(")를 사용하는데요. 이번에도 역시 예제를 먼저 만들어보겠습니다.



■ char형 aaa라는 배열이 메모리에 할당되고, [Hello World!] 문자열이 순서대로 저장됩니다. 그리고 지난 글에서 알아봤던 sizeof() 함수를 이용해서 배열의 길이를 구해서 출력하고 있는데요. 배열의 길이가 '13'이군요. 위 예제에서 char aaa[]="Hellw World!"는 char aaa[13]..... 인데, 배열 길이 값 '13'을 생략하고 초기화 하면 컴파일러가 자동으로 길이 값을 채워준다는 것도 배열 개념 알아볼 때 정리했었습니다. 참고하시구요. 


■ 그런데 좀 이상하지 않나요? 큰따옴표 안에는 공백 포함해서 정확히 12개의 문자열이 저장되어 있습니다. 아직 안 세어보셨으면 세어보세요. 분명히 공백 포함해서 12개입니다. 그런데 배열의 길이가 13으로 표시되네요? 여기에서 null 문자(\0)가 등장하게 됩니다. C언어에서는 문자열을 저장할 때 맨 마지막에 무조건 null 문자가 저장되는데요. 이유는 다음과 같습니다. 


■ 메모리에 문자열이 저장될 때 이진수로 저장되기 때문에 문자열의 시작과 끝을 표시할 수 있는 방법이 없습니다. 하지만 문자열의 시작은 char aaa[0]; 자리인 건 알 수 있습니다. 문제는 끝을 알 수가 없다는 건데요. 그 끝을 표시해주는 게 null 문자(\0)입니다. 그래서 무조건 문자열의 끝에는 null 문자가 붙게 됩니다. 이 녀석의 아스키코드값과 char형의 값을 출력해보겠습니다.



■ 배열의 마지막 자리[13]에 있는 null의 값을 정수와 문자 형태로 출력했습니다. 숫자 값은 "0"인걸 알 수 있고요. 문자 형태의 값은 아무것도 없습니다. 여기서 주의해야 할게 하나 있는데요. 공백이 아니고, 아무것도 없는 겁니다. 참고로 공백의 아스키코드값은 "32"입니다. 마지막으로 null과 " " 공백의 아스키코드 값을 출력해볼게요.



■ char 형태의 '\0'과 공백 ' '의 값을 정수(%d) 형태로 출력하고 있는 내용입니다. 확실하게 구분이 되죠?^^