검색결과 리스트
2011/04/29에 해당되는 글 3건
- 2011.04.29 문자열 조작함수 직접 구현하기 (2)
- 2011.04.29 Objective-C 문자열 조작 메서드
- 2011.04.29 NSNotification (1)
글
문자열 조작함수 직접 구현하기
언어로그/C/C++
2011. 4. 29. 14:41
API를 이해하기 위한 가장 좋은 방법 중 하나는 직접 구현해보는 것이다
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
가지고 있는데 직접 구현한 버전에는 "my_" 라는 접두어를 붙혔다.
1. 문자열 함수들의 프로토 선언과 기능
- // 문자열 s의 길이를 반환하는 함수
int strlen(char *s);
// s에 문자열 t를 복사하는 함수- void strcpy(char *s, char *t);
- // 두 문자열을 비교하는 함수 : 같으면 0, 앞문자열이 크면 양수, 작으면 음수반환
- int strcmp(char *s, char *t);
// 문자열 dest의 끝에 src 문자열을 연결하는 함수
- char *strcat(char *dest, const char *src)
- // 문자열 string에서 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strchr(const char *string, int c);
- // 문자열 string의 끝에서부터 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strrchr(const char *string, int c);
- // 문자열 string에서 문자열 strSearch를 찾아 첫번째 위치를 반환. 없으면 NULL 반환
- char *strstr(const char *string, const char *strSearch);
- // 문자열 string에서 strCharSet문자열에 속한 문자가 발견되면 그 위치를 반환. 없으면 NULL 반환
- char *strpbrk(const char *string, const char *strCharSet);
- // 문자열 str에서 delims 문자열에 속한 문자를 구분자로 분리해주는 함수. 첫번째 호출후
- // NULL 을 주어 호출하면, 기존 문자열에서 계속 구분자를 기준으로 분리해서 반환해줌// 원 문자열을 변경하기 때문에 원치않다면 원문자열의 복사본을 사용해야 한다.
- char *strtok(char *str, const char *delims);
2. 문자열 조작 함수의 구현
#include <stdio.h>
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
'언어로그 > C/C++' 카테고리의 다른 글
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
|---|---|
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
c함수,
strcat,
strchr,
strcmp,
strcpy,
string,
strlen,
strpbrk,
strrchr,
strstr,
strtok,
문자열,
문자열 조작,
함수
설정
트랙백
댓글
글
Objective-C 문자열 조작 메서드
Objective-C
2011. 4. 29. 12:22
Objective-C 문자열 조작 메서드 중 몇가지에 대해서 알아보자.
문자열 비교시 결과값을 위해 다음과 같은 enum 상수가 선언되어 있다.
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
NSOrderedAscening은 좌측의 피연산자가 우측의 피연자보다 작다는 것을
NSOrderedDescending은 좌측의 피연자가 우측의 피연자보다 크다는 것을
NSOrderedSame은 좌우측의 피연산자가 같다는 것을 나타낸다.
다음은 문자열에 포함된 특정 문자열이나 NSArray 안에 특정 Object와 같이 범위를 지정하기 위해 사용되는 구조체이다.
NSOrderedDescending은 좌측의 피연자가 우측의 피연자보다 크다는 것을
NSOrderedSame은 좌우측의 피연산자가 같다는 것을 나타낸다.
다음은 문자열에 포함된 특정 문자열이나 NSArray 안에 특정 Object와 같이 범위를 지정하기 위해 사용되는 구조체이다.
typedef struct _NSRange {
NSUInteger location; // start index
NSUInteger length; // location 위치부터의 길이
} NSRange;
다음은 초 단위로 시간간격을 지정하기 위한 타입정의이다.
typedef double NSTimeInterval;
이름만을 보고도 충분히 그 의미를 알수 있기 때문에 메서드에 대한 설명은 생략하겠다. (-_-;;)
문자열 비교
- (NSComparisonResult)compare:(NSString *)aString - (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString - (BOOL)isEqualToString:(NSString *)aString - (BOOL)hasPrefix:(NSString *)aString
문자열 접합
- (NSString *)stringByAppendingString:(NSString *)aString - (NSString *)stringByAppendingFormat:(NSString *)format ...
문자열 분할
- (NSString *)substringToIndex:(NSUInteger)anIndex - (NSString *)substringFromIndex:(NSUInteger)anIndex - (NSString *)substringWithRange:(NSRange)aRange
문자열 검색
- (NSRange)rangeOfString:(NSString *)aString - (NSRange)lineRangeForRange:(NSRange)aRange
문자열 치환
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
문자열 변환
- (NSString *)capitalizedString - (NSString *)lowercaseString - (NSString *)uppercaseString - (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding - (const char *)cStringUsingEncoding:(NSStringEncoding)encoding
문자열 토큰 분리
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator - (NSArray *)componentsSeparatedByString:(NSString *)separator
'Objective-C' 카테고리의 다른 글
| Objective-C 문자열 조작 메서드 (0) | 2011.04.29 |
|---|---|
| 다중인자를 갖는 PerformSelector 메시지 (0) | 2011.03.23 |
| Protocol 과 Category (0) | 2011.03.22 |
| Objective-C 훑어보기 (2) | 2011.03.20 |
| [Cocoa] Cocoa Design Pattern (0) | 2011.03.20 |
| HMAC-SHA1 구현 (0) | 2011.03.03 |
설정
트랙백
댓글
글
NSNotification
아이폰
2011. 4. 29. 11:54
Cocoa 와 Cocoa Touch 프레임웍의 이벤트 통지 메커니즘인 NSNotification 에 대해서 간략하게 알아보자.
1. NSNotification 이란?
다수의 객체들 사이에서 이벤트가 발생했음을 알리는 방식으로, 한 객체와 다른객체 간에 의존관계를 중계하는 클래스에
집중화시켜서 서로 간에 결합도를 느슨하게 할 수 있다. NSNotificationCenter, NSNotification, Observer 로 구성된다.
NSNotificationCenter는 객체들 사이에 이벤트 전달을 중계하는 역할을 하며, Observer는 이벤트가 발생하기를 기다리는 대상을
나타낸다. Observer 가 기다리는 이벤트에 대한 정보와 부가적인 데이터를 전달하기 위한 객체가 Notification 이다.
집중화시켜서 서로 간에 결합도를 느슨하게 할 수 있다. NSNotificationCenter, NSNotification, Observer 로 구성된다.
NSNotificationCenter는 객체들 사이에 이벤트 전달을 중계하는 역할을 하며, Observer는 이벤트가 발생하기를 기다리는 대상을
나타낸다. Observer 가 기다리는 이벤트에 대한 정보와 부가적인 데이터를 전달하기 위한 객체가 Notification 이다.
Observer 는 객체의 역할을 지칭하는 용어이며, NSObject를 상속하는 모든 클래스가 Observer 가 될수 있다.
Notification 사용예
푸시 메시지가 도착했을 때, 현재 화면에 상관없이 특정화면으로 전환하기 위해 사용하였다.
화면은 항상 (화면1 > 화면2 > 화면3) 순서로 네비게이션 이동이 이루어진다고 해보자. 푸시 이벤트는 UIApplicationDelegate 프로토콜을 구현하는 클래스에서 수신하면, 이곳에서 NSNotification 이벤트를 발생시킨다. 실행되고 있는 App이 현재 어떤 화면을 보여주고
있던지 이벤트를 수신하는 클래스에서는 연쇄적으로 Notification을 다음화면으로 전달하여 (화면1 > 화면2 > 화면3) 의 순서를 유지하며 화면 전환을 할 수 있다. (화면1 > 화면3으로 바로 전환해버리면 네비게이션 순서가 틀어져버림)
있던지 이벤트를 수신하는 클래스에서는 연쇄적으로 Notification을 다음화면으로 전달하여 (화면1 > 화면2 > 화면3) 의 순서를 유지하며 화면 전환을 할 수 있다. (화면1 > 화면3으로 바로 전환해버리면 네비게이션 순서가 틀어져버림)
이외에도 비동기 방식으로 동작하는 NSURLConnection에서 데이터 수신이 완료되면, 수신한 데이터를 전달할 때 NSNotification을
사용하면 클래스간에 참조를 가지고 있지 않아도 데이터를 쉽게 전달할 수 있다.
2.3 이벤트 발생시키기
* 부가적으로 전달해야할 데이터가 있을 경우 사용
2.4 등록된 observer와 Notification 제거
사용하면 클래스간에 참조를 가지고 있지 않아도 데이터를 쉽게 전달할 수 있다.
2. NSNotification 을 사용하기 위한 절차
① NSNotificationCenter에 Observer 와 Notification 등록
② Notification 포스팅
② Notification 포스팅
③ 처리
④ NSNotificationCenter 에서 Observer 와 Notification 제거
④ NSNotificationCenter 에서 Observer 와 Notification 제거
2.1 Notification 등록
NSNotificationCenter 의 클래스 메소드 defaultCenter를 사용하여 로컬 NotificatonCenter의 싱글턴 객체를 얻을 수 있다.
이 클래스에서 지원하는 메서드를 사용하여 Notification을 등록 할 수 있다. 인자 Observer는 이벤트 발생시 수신할 객체,
selector는 이벤트 수신시 수행할 메시지 selector, name은 이벤트의 이름, object는 이벤트를 발생시킬 객체이며, nil을 주면
이벤트를 발생시킬 객체의 종류에는 상관없이 이벤트를 수신한다
NSNotificationCenter *notifCenter = [NSNotificationCenterdefaultCenter];
[notifCenter addObserver:self
selector:@selector(viewTrasitionToMyLostArticleList:)
name:@"moveToPushList" object:nil];
위 문장은 다음과 같이 해석된다.
“ 어떤 object가 어떤 이름의 이벤트를 보내면, observer의 selector를 호출해줘”
2.2 Notification 메시지의 형태
Observer의 수신 메시지의 형태는 반드시 NSNotification* 타입의 인자 하나를 받아야 한다.
그렇지 않으면 unrecognized selector sent
에러가 발생한다.
에러가 발생한다.
(void)viewTrasitionToMyLostArticleList:(NSNotification*)notif {
NSString *pushSeq = [[notif userInfo] objectForKey:@"pushSeq"];
// 의심분실물 목록뷰로 전환
}
2.3 이벤트 발생시키기
NSNotificationCenter의 다음과 같은 메소드를 사용하여 Notification을 발생시킬 수 있다.
* Notification을 직접 생성하여 전달 - 데이터 전달이 필요없을 경우
* Notification을 직접 생성하여 전달 - 데이터 전달이 필요없을 경우
(void)postNotification:(NSNotification*)notification;
* 부가적으로 전달해야할 데이터가 있을 경우 사용
(void)postNotification:(NSString*)notificationName
object:(id)anObject
userInfo:(NSDictionary*)userInfo
2.4 등록된 observer와 Notification 제거
NSNotificationCenter 등록되어 있는 observer와 notification은 사용후 메모리 절약을 위해 제거해주는 것이 좋다.
// notificationObserver와 동일한 참조의 모든 observer를 제거
(void)removeObserver:(id)notificationObserver
// 송신자가 notificationSender로 등록된 notificationName으로 등록된 모든 observer 제거
(void)removeObserver:(id)notificationObserver
name:(NSString *)notificationName
object:(id)notificationSender
'아이폰' 카테고리의 다른 글
| [번역] 사용자 인터페이스 설계의 원리 (0) | 2012.06.24 |
|---|---|
| 수동으로 UI 컨트롤에 이벤트 전달 (0) | 2011.11.13 |
| NSNotification (1) | 2011.04.29 |
| 푸시 메시지 포맷 (0) | 2011.04.07 |
| 애플 푸시 서비스 (0) | 2011.04.07 |
| Sprite Sheet 제작툴 Zwoptex (0) | 2011.03.16 |
my_string.c