제11장 문자열
문자열정의 문자열과포인터, 문자열과배열 2 차원문자열배열, 2 차원문자열포인터 문자열함수, 헤더파일 string.h ctype.h strlen(), strcat(), strcpy(), strstr(), strchr(), strcmp(), strtok() getc(), putc(), fgetc(), fputc(), gets(), puts(), fgets(), fputs() 명령줄라인 한밭대정보통신공학과 и чунг хо 2
문자열 : 문자가연속적으로나열되어있고맨마지막에 NULL 문자로끝나는것. C 언어에서는 으로시작해서 로끝난다. 는문자 1 개를뜻하고 는맨마지막에 NULL 문자가있는것을의미한다. char str[]= I love you! ; //str 주소상수 int len = sizeof(str); //len 은 12, NULL 문자포함 int len = strlen(str); //1en 은 11, NULL 제외길이 문자열처리함수를사용전에 #include <string.h> 를포함시켜야함. 한밭대정보통신공학과 и чунг хо 3
char *p = I love you! ; //p 는문자열을가리키는포인터임. p++ 와같이 p 가포인터이므로값이변할수있음. int len = sizeof(p); //len 은 4, 포인터의길이 char str[]= I love you! ; int len = sizeof(str); //len 은 12, str 은주소상수 // NULL 문자를포함문자열길이 str 은상수이므로 str++ 와같은연산이불가능함. 한밭대정보통신공학과 и чунг хо 4
char *p[]={ a, bad, good, adore }; 컴파일러가 [] 안에 4 가들어간다고해석 문자열 4 개의처음을가리키는포인터 4 개는각각 p[0], p[1], p[2], p[3] 각문자열의크기는 sizeof( a ) 와같이하면각각 2, 4, 5, 6 이된다. 이것을 ragged 배열이라한다. 물론 sizeof(p[0]) 이면포인터의길이가되어 4 개의포인터모두길이 4 가된다. 한밭대정보통신공학과 и чунг хо 5
#include <stdio.h> int main() { char *p[] = { "a", "bad", "good", "adore" }; int i; for (i = 0; i<4; i++) printf("%s\n", p[i]); // 각문자열을프린트한다. return 0; } 한밭대정보통신공학과 и чунг хо 6
char p[][6] = { "a", "bad", "good", "adore" }; 이경우에 p 는주소상수이다. 각문자열의크기는 4 개의문자열모두길이가 6 로정해져있다. 6 이열의수로들어가있기때문이다. 컴파일러는앞의 [] 에 4 가들어있는것으로해석하여 4 개의문자열이있은것으로생각한다. 한밭대정보통신공학과 и чунг хо 7
#include <stdio.h> int main() { char p[][6] = { "a", "bad", "good", "adore" }; int i; for (i = 0; i<4; i++) printf("%s\n", p[i]); // 각문자열을프린트한다. // 결과는같으나각문자열의길이가 6 으로일정하다는점이다르다. return 0; } 한밭대정보통신공학과 и чунг хо 8
string.h 를포함시켜야한다. 문자열줄단위입출력함수 : 한줄입력 : gets() 또는 fgets(char *, int, FILE *) 한줄출력 : puts() 또는 fputs(char *, int, FILE *) 한줄출력 : puts() #include <stdio.h> int main() { char line[80]; gets(line); //fgets(line,80,stdin) puts(line); // fputs(line,80,stdout) return 0; } 한밭대정보통신공학과 и чунг хо 9
버퍼를이용하지않고문자한개씩즉시처리 getche() : 입력시에화면에보인다. e는 echo라고기억하면된다. getch() : 입력시에화면에보이지않는다. #include <stdio.h> #include <conio.h> int main() { char line[80]; int i = 0; while ((line[i++] = _getch())!='\r');//enter키를칠때까지 line[i] = NULL; puts(line); return 0; } 한밭대정보통신공학과 и чунг хо 10
int isalpha(int): 매개변수가영문자이면 0 이아닌값을, 아니면 0 을반환 int isdigit(int ): 매개변수가숫자이면 0 이아닌값을, 아니면 0 을반환 int isalnum(int ): 매개변수가영문자또는숫자이면 0 이아닌값, 아니면 0 을반환 int ispunct(int ): 매개변수가구획문자 ( 영문자, 숫자, 공백이외의출력가능한문자 ) 이면 0 이아닌값을, 아니면 0 을반환 int isspace(int ): 매개변수가공백이면 0 이아닌값을, 공백이면 0 을반환 int isxdigit(int ): 매개변수가 16 진수숫자이면 0 이아닌값을, 아니면 0 을반환 한밭대정보통신공학과 и чунг хо 11
int isprint(int ) : 출력가능한문자이면 0 이아닌값을, 아니면 0 을반환 int iscntrl(int ): 제어문자이면 0 이아닌값을, 아니면 0 을반환 int isascii(int ): ASCII 코드이면 0 이아닌값을, 아니면 0 을반환 int isupper(int ): 매개변수가대문자이면 0 이아닌값을, 아니면 0 을반환 int islower(int ): 매개변수가소문자이면 0 이아닌값을반환, 아니면 0 을반환 한밭대정보통신공학과 и чунг хо 12
int isprint(int ) : 출력가능한문자이면 0 이아닌값을, 아니면 0 을반환 int iscntrl(int ): 제어문자이면 0 이아닌값을, 아니면 0 을반환 int isascii(int ): ASCII 코드이면 0 이아닌값을, 아니면 0 을반환 int isupper(int ): 매개변수가대문자이면 0 이아닌값을, 아니면 0 을반환 int islower(int ): 매개변수가소문자이면 0 이아닌값을반환, 아니면 0 을반환 한밭대정보통신공학과 и чунг хо 13
int toupper(int): 매개변수를대문자로변환하여반환 int tolower(int): 매개변수를소문자로변환하여반환 int toascii(int): 매개변수를아스키코드로변환하여반환 한밭대정보통신공학과 и чунг хо 14
char* strcpy(char* s1, const char* s2); s2 가가르키는문자열을 s1 이가르키는문자열로 NULL 문자까지포함하여복사하고리턴값은 s1 의시작주소를반환한다. char* strncpy(char* s1, const char*s2, size_t n); s2 가가르키는문자열의내용을 n byte 만큼 s1 이가르키는문자열로복사하고리턴값은 s1 의시작주소를반환한다. char* strcat(char* s1, const char* s2); s2 가가르키는문자열을 s1 이가르키는문자열의끝에이어서복사한다. 리턴값은 s1 의시작주소를반환한다. char* strncat(char* s1, const char* s2, size_t n); s2 가가르키는문자열을 s1 이가르키는문자열끝에 n 바이트만큼복사한다. 리턴값은 s1 의시작주소를반환한다. 한밭대정보통신공학과 и чунг хо 15
처음에는자르기대상인문자열과자르기를위한문자를인수로호출. strtok( str, sep); 이후에는문자열대상을 NULL과자르기를위한문자만인수로전달. strtok( NULL, sep); 더이상구할문자열이없다면 NULL이반환. char *sep=,, *p; char *str[]= C, C++, Java, Object C ; p= strtok(str,sep); while(p!=null) { printf( %\n, p); p=sttok(null,sep); } 한밭대정보통신공학과 и чунг хо 16
처음에는자르기대상인문자열과자르기를위한문자를인수로호출합니다. strtok( str, sep); 이후에는문자열대상을 NULL 과자르기를위한문자만인수로전달합니다. strtok( NULL, sep); 더이상구할문자열이없다면 NULL 이반환됩니다. 한밭대정보통신공학과 и чунг хо 17
int strcmp(const char* s1, const char* s2); s1의아스키코드값에서 s2의값을빼서그값을반환한다. S1이 s2보다더크면양수 ( 보통 1) 를반환하고, 그반대면음수 ( 보통 -1) 을반환한다. 두문자열이같을경우 0을반환한다. int strncmp(const char* s1, const char* s2, size_t n); 기본적으로 strcmp 와동일하나 n 바이트만큼만비교한다. char* strchr(const char* s, int c); s 가가르키는문자열에서아스키코드 c 에해당하는문자가처음나타나는위치의주소값을반환한다. 찾는문자값이없는경우 NULL 을반환한다. char* strtok (const char* s1, const char *s2); s1 은자르기대상문자열, s2 는잘라내기위한문자의모임이다. 잘라내기한문자열의첫번째포인터를반환하며, 문자열이없다면 NULL 을반환한다. 한밭대정보통신공학과 и чунг хо 18
char* strbrk(const char* s1, const char* s2); s1 이가르키는문자열에서 s2 에포함된문자가처음나타난위치의주소값을반환한다. 찾을수없는 NULL 반환. char* strrchr(const char* s, int c); s 가가르키는문자열에서 c( 아스키코드값 ) 에해당하는문자가마지막으로나타나는위치의주소값을반환한다. 널문자도문자열의일부이므로찾을수있으며찾는값이없을경우 NULL 반환. char* strstr(const char* s1, const char* s2) S1 이가르키는문자열에서 s2 의문자열이처음나타난위치의주소값을반환한다. 없으면 NULL 반환. 보통부분적인문자열일치유무를확인할때사용한다. size_t strlen(const char* s); 문자열 s 의문자의수 ( 바이트단위 ) 반환. 널 ('\0') 문자는포함안함. 보통문자열의문자길이를체크할때쓴다. 한밭대정보통신공학과 и чунг хо 19
#include <stdio.h> int main(int argc, char **argv) { //argc : 명령줄라인의매개변수수 //argv: 명령어부터 argv[0], argv[1], argv[2].. int i; for(i=0;i<argc;i++) printf( argv[%d]=%s\n, i, argv[i]); return 0; } 한밭대정보통신공학과 и чунг хо 20
명령줄라인커맨드실행방법 1. 솔루션클릭 /Windows 탐색기에서폴더열기 /Debug 클릭 2. 텍스트로주소복사 3. 마이크로소트로고클릭 / 프로그램및파일검색에서 cmd 라고쳐넣고엔터 / 4. cd ( 여기에주소붙여넣기하고엔터 ) 5. 여기에서솔루션이름 ( 여기서는 argtest) 을치고매개변수들 (arguments) 을차례로입력한다. 엔터 한밭대정보통신공학과 и чунг хо 21
문자열정의 문자열과포인터, 문자열과배열 2 차원문자열배열, 2 차원문자열포인터 문자열함수, 헤더파일 string.h ctype.h strlen(), strcat(), strcpy(), strstr(), strchr(), strcmp(), strtok() getc(), putc(), fgetc(), fputc(), gets(), puts(), fgets(), fputs() 명령줄라인 한밭대정보통신공학과 и чунг хо 22