6.2. 최지혁 ¶
*문자열 = 문자 배열 [c] [r] [e] [a] [m] ex) char* str = "cream" *str = c *(str + 1 ) = r *(str + 2 ) = e ... *직접 문자열 만들기 char str[10]; str [0] = 'c' 1 ... str[n] = \0 넣어야! (안넣으면 무한 루프) *char c = '\0' -> 널 문자(문자끝) printf("%s","cream\n" ) -> cream\n\0이 되서 \0 나올때까지 출력 (\n,\0는 한 문자로 인식)
#pragma warning (disable:4996) #include<malloc.h> int strlen(char*s) //길이 { int res = 0; for (; *s != '\0'; s++, res++) return res; } int strcmp(char*s, char*d) //일치비교 { for (;*s != '\0'; s++, d++) if(*s != *d)return 0; if (*d == '\0') return 1; return 0; } void strtoupper(char*str) // ""로 한 건 여기에 넣을 수 없다. ""는 다른데도 쓰일까봐 상수로 처리되서 변경 x. 대신 ''로 하나하나 넣은건 넣을 수 있다. { for (; *str != '\0'; str++) { if (*str >= 'Q' && *str <= 'z') *str == 'A' - 'a'; } } int strtolower(char*str) { for( ;*str!='\0' ; str ++ ) { if(*str >= 'Q' && *str <= 'z') *str == 'a' - 'A'; } } } int strcpy(char*d ,char*s) //문자열 내용 복사 d는 복사될 장소, source는 복사할 원본 { for (; *s != '\0'; s++, d++) { *d = *s; } *d = '\0'; } char* strdup(char*s) //문자열 생성+복사 { int len = strlen(s); //문자 몇 갠지 세기 char *res = (char*)malloc(sizeof(char)*(len + 1)); for (int i = 0; i <= len; i++) res[i] = s[i]; return res; } void strcat(char*d, char*s) // 하나를 다른 하나의 뒤에 연결하기. d는 수정가능, 직접 메모리할당하든 함수로 하든 한땀한땀 넣은거만 d에 넣을 수 있음, d는 충분히 커야함 { for (; *d != '\0'; d++); //문자열 끝까지 주소 이동 for (; *s != '\0'; s++, d++) *d = *s; *d = '\0'; } int strstr(char*s, char*p) //p는 패턴 한 문자열 안에 다른 문자열 있나 확인 { int s_len,p_len; p_len = strlen(p); s_len = strlen(s); for (int i = 0; i < s_len - p_len /*이거 없음 i 더 커져서 다른 곳 침범*/; i++) { if (s[i] == p[0]) //다른 문자열에서 같은 첫글자 발견시 { int k; for (k = 0; k < p_len; k++) //중간에 문자가 달라 if에 걸려 나오지 않으면 맞는거 if (s[i + k] != p[k]) break; if (k == p_len) return i; //다 맞으면 i(시작할 위치)에 리턴, 틀리면 break로 다시 for 돌기 } return -1; } }
6.3. 박인서 ¶
- 문자열 : 문자 배열->문자를 여러개 저장
- 선언 : char * str;(기존의 포인터 배열처럼 *(str+i)로 지정 가능) 혹은 char str원하는 문자열의 문자 갯수;
- 문자열의 끝을 NULL='\0'(아스키코드값 0)로 지정->원하는 문자열 길이+1
- %s로 출력, 쌍따옴표("")는 마지막에 알아서 NULL문자를 넣어줌.
- 선언 : char * str;(기존의 포인터 배열처럼 *(str+i)로 지정 가능) 혹은 char str원하는 문자열의 문자 갯수;
- 문자열 함수
- strlen : 문자열의 길이을 return
- strlen : 문자열의 길이을 return
int strlen(char * s) { int res=0; for(;*s!='\0';s++) res++; return res; }
- strcmp : 문자열 2개를 비교하여 같으면 1을 return, 다르면 0을 return
int strcmp(char * s, char * d) { for(;*s!='\0';s++,d++) if(*s!=*d) return 0; if(*d=='\0') return 1; return 0; }
- strtoupper : 소문자를 대문자로 모두 변경(직접 대입한 문자(열)를 바꾸기 못함)
void strtoupper(char * str) { for(;*str!='\0';str++) if(*str>='a' && *str<='z') *str+=(int)('A'-'a'); }
- strtolower : 대문자를 소문자로 모두 변경(직접 대입한 문자(열)를 바꾸기 못함)
void strtolower(char * str) { for(;*str!='\0';str++) if(*str>='A' && *str<='Z') *str+=(int)('a'-'A'); }
- strcpy : 한 문자열의 내용을 다른 문자열에 복사(문자열의 길이가 복사하고자 하는 문자열 변수의 범위를 초과하면 안됨)
void strcpy(char * d, char * s) { for(;*s!='\0';s++,d++) *d=*s; *d='\0'; }
- strdup : 문자열 하나를 생성 후 그 곳에 다른 문자열을 복사
char * strdup(char * s) { int len=strlen(s),i; char * res = (char *) malloc(sizeof(char)*(len+1)); for(i=0;i<=len;i++) res[i]=s[i]; return res; }
- strcat : 한 문자열의 내용을 다른 문자열에 이어붙이기(붙여야 될 문자열 변수가 수정할 수 있는 문자열이여야 함, 붙여야 될 문자열 변수가)
void strcat(char * d, char * s) { for(;*d='\0';d++) ; for(;*s!='\0';s++,d++) *d=*s; *d='\0'; }
- strstr : 한 문자열 내에 다른 문자열의 내용이 존재하는지 확인, 인덱스 위치를 return 못찾으면 -1을 return
int strstr(char * s,char * p) { int slen,plen,i,j; slen=strlen(s); plen=strlen(p); for(i=0;i<(slen-plen);i++) { if(s[i]==p[i]) { for(j=i;j<=i+plen;j++) if(s[i+j]!=p[j]) break; if(j==plen) return i; } } return -1; }
- trim :
꺼억두가지 종류가 있다.
- ltrim : 문자가 나오기 전까지의 공백을 앞으로 땡김
- ltrim : 문자가 나오기 전까지의 공백을 앞으로 땡김
void ltrim(char * str) { int cnt=0; for(;*str!='\0';str++) { if(*str==' ') { cnt++; *(str+cnt)==*str; } } }
- rtrim : 문자열이 다나온 뒤의 공백을 없애고 NULL을 앞으로 땡김
void rtrim(char * str) { int len,cnt=0,i; for(i=len-1;i>=0;i--) { if(*(str+i)==' ') { cnt++; *(str+i)=*(str+i+cnt); } } }
- 강사님이 너무 힘들어 하시는 것 같아서 제가 한번 페이지를 만들어 보았습니다. 허헣 - 박인서