
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 반환은 intfgets(), getc(), getchar() 같은 문자열 입출력 함수는 모두 스트림으로부터 문자를 읽어 int를 반환한다.
MAX_STRING_LEN을 강제한다.
strncpystrncatfgetssnprintfNULL과 '\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. 해결 방법
