char
, signed char
, unsigned char
를 문자 타입이라고 한다.char
가 signed char
, unsigned char
와 동일한 범위와 표기를 갖도록 정의한다.char
는 이 둘과 분리된 타입이며, 서로 호환도 되지 않는다.char
사용stdin
입력{,f,v}scanf
피할 것1. 부적절한 코드
fgets
사용scanf
류를 피하고 **fgets()
를 사용하자.NULL
을 찾을 때, 문자열에선 \0
을 사용하자.NULL
은 진짜 주소가 없는 NULL
임\0
은 NULL 문자임fgets
-> strtol
사용fgets
함수를 사용하라strtol
함수를 사용할 것strtol
함수는 입력 문자열이 long
에서 유효한지 점검하는 에러 체크 제공strtol
: long int
반환
strtoll
: long long int
반환
strtoul
: unsigned long int
반환
strtoull
: unsigned long long int
반환
atoi
류 함수는 문제가 많으므로 사용 지양errno
를 설정하지 않는다.fgets
반환은 int
fgets()
, getc()
, getchar()
같은 문자열 입출력 함수는 모두 스트림으로부터 문자를 읽어 int를 반환한다.MAX_STRING_LEN
을 강제한다.strncpy
strncat
fgets
snprintf
NULL
과 '\0'
은 다르다!
NULL
: 말그대로 주소가 없는 것NULL
을 받음'\0'
: 널 문자, 문자 있는데 널 문자인 것임!\0
을 찾아야지 NULL
을 찾지말 것!1. 해결 방법
'\0' 문자로 끝내기 보장하기
'\0'
문자 종료를 고려해 루프 종료 조건 수정strtok()
토큰 파싱strtok()
토큰 파싱은 문자열 복사본 만들어 사용strtok()
는 호출되면 문자열 내의 구분자가 처음 나타나는 부분까지 파싱 -> 구분자를 NULL로 바꿈 -> 토큰의 처음 주소 반환strtok()
함수를 호출하면 가장 최근에 NULL로 바뀐 부분부터 파싱이 시작된다.strtok()
는 인자를 수정하므로 원본 문자열은 안전 X, 원본 문자열을 보존하고 싶다면 문자열 복사본 만들어 사용1. 부적절한 코드
strtok
함수를 잘못 사용하는 경우, 데이터 잘립으로 인해 의도치 않은 결과 나타날 수 있다.1. 해결 방법
strchr()
로 \n
개행 없애자!strchr()
함수는 아래와 같다.arg | description |
---|---|
char* str | 검색할 문자열 |
int c | 존재하는지 확인할 문자(아스키 값) |
return | description |
---|---|
!NULL ptr | 문자가 존재하는 포인터 |
NULL | 해당 문자가 존재하지 않음 |
char str[]="BlockDMask";
char* ptr=strchr(str, 'M'); // search 'M'
if(ptr != NULL){
printf("%c %d", *ptr, ptr);
}
fgets
함수 실패 시 문자열 리셋fgets()
함수가 실패하면 전달된 배열의 내용은 정의되지 않는 상태가 되므로 주의할 것fgets()
함수 Error Handling Code 필수'\0'
을 그냥 박는다.memset
다음의 메모리는 재활용 시 민감한 정보가 있을 수 있기 때문에, memset
후 재활용한다.
1. 부적절한 코드
memcpy
로 restrict
지정자를 사용 금지memcpy
로 restrict 지정자를 사용한 함수로 동일한 객체 주소 인자 전달 시, unexpected behaviour, 결과 알 수 없음memmove
사용할 것volatile
금지volatile
은 데이터가 프로그램이 아닌 외부적 요인에 의해 변경될 수 있다고 컴파일러에게 캐싱 제한할 때 사용(최적화 금지)1. 부적절한 코드
1. 해결 방법