char *str[16] = {"a", "b", "c", "d"}; char **ptr = str; ptr[4] = "e"; for (int i = 0; i < strlen(str) + 5; i++){ printf("string %d is %s\n", i, ptr[i]); } str 자체는 포인터 없이도 그 문자열의 시작을 가리킨다. *str 은 문자열의 개별적인 칸들 즉 0번째, 1번째, 2번째,, 칸을 가리킨다. 그래서 일련의 문자열을 선언하려면 이걸 써야한다. **str 은 문자열의 특정한 칸을 가리킨다. 그래서 특정 문자열을 선언하려면 이걸 써야한다.
화살표의 의미 구조체를 포인터로 가져왔을 경우 . 대신 쓰는 것. #include typedef struct { int s_id; int age; } Student; int main(){ Student goorm; Student *ptr; ptr = &goorm; (*ptr).s_id = 1004; // (*ptr).age = 20; ptr->age = 20; printf("goorm 의 학번 : %d, 나이 : %d\n", goorm.s_id, goorm.age); } goorm이 바꾸고자하는 구조체. *ptr이 이걸 바꾸기 위한 손가락. 이때 손쉽게 바꾸는 것이 바로 -> 기호. struct hostent *he; struct in_addr **addr_list; struct in_addr addr;..
지금 하는건 C언어를 사용해서 fgets 로 buf 크기를 제한한 환경에서 HTTP stream 을 처리하는 일을 해보고 있다. 왜하냐? 싶지만 우리가 편하게 쓰는 java, python 의 response, request 객체 안에서 어떤 일이 벌어지는지 캐시, 커널이 얼마나 감사한 존재인지를 알기 위해서 진행해보려고 한다. buf를 재설정하기 memset(buf, 0, BUF_LEN); 이런식으로 아무때나 밀어도 되고 char buf[BUF_LEN] = {0,}; 설정할때 밀어도 된다 for (int i = recv_len; i < BUF_LEN; i++) { buf[i] = '\0'; } 아니면 원하는 조건대로 밀어도 된다. fgets 상황에서 buffer flush 하기 while(getchar(..
형식 지정자 C 프로그래밍 언어에서 형식 지정자는 읽거나 쓰는 데이터의 형식과 형식을 지정하기 위해 형식이 지정된 입력/출력 함수에 사용되는 특수 문자입니다. 이들은 printf(), scanf(), fprintf() 및 fscanf()와 같은 함수와 함께 사용됩니다. %d = int (정수) 정수 값을 읽거나 씁니다. %s = string (문자열) 문자열을 읽거나 씁니다. %c = char (문자) 단일 문자를 읽거나 씁니다. %f = float (실수, 0.1을 0.100000 으로 출력) 부동 소수점 값을 읽거나 씁니다. %g = float (실수, 0.1을 0.1로 출력) %e = 지수형 값을 읽거나 씁니다. %o = 8진수 값을 읽거나 씁니다. %x = 16진수 값을 읽거나 씁니다. %p = ..
\n 처리. fgets은 \n까지 저장하는 친구이기 때문이다. 그래서 이를 처리해주고 넘어가야한다. int main (void){ char end[16]; fputs("메시지 입력 : ", stdout); fgets(end, 16, stdin); printf("%d\n", (int)strlen(end)); end[strlen(end)-1] = '\0'; printf("%d\n", (int)strlen(end)); printf("%d\n", strcmp(end, "123")); } Strcmp int strcmp(const char *s1, const char *s2); 두 문자열이 [완전히] 일치하는지 확인하는 함수. 아닌경우 틀린 코드끼리의 아스키값 차이를 반환한다. fget char *fgets(ch..
미션 1. 실시간으로 받은 내용을 output 해보자 2. buffer 크기 이상으로 받은 내용을 output 해보자 (hint : 무조건 한번에 출력해야하는건 아니다. 나눠서 출력해도 무방) 1번은 굉장히 쉽다. 버퍼가 일을 잘해주기 때문에 그 이상의 입력값도 알아서 인식해서 뱉어준다. 그런데 어려운건 [str의 끝은 0이어야 한다]는 규칙을 지키며 깔끔하게 짜는게 어려웠다. 전체 코드는 다음과 같다. 6으로 제한을 걸어둔 상태로 그 이상도 깔끔하게 나오게 해보기 위해 노력해보았다. #include #include #include #include #include #include #include #include #include #define MSG_MAX 6 #define BUF_LEN 6 int mai..
scanf() %s 는 스페이스를 끝으로 인식해 그 다음 0을 넣어 문자열을 종결시킨다. stdin/stdout을 거쳐 동작. char str[16]; printf("msg : %s", str); scanf("result is %s", str); //scanf("%[^;]s", str); 이러면 끝을 ;로 인식 fgets() 스페이스를 극복하기 위해 나왔다. stdout/stdin buffer flow로 배열포인터에 size-1개씩 \n까지 포함해 저장한다. fputs("메시지를 입력하세요 : ", stdout); fgets(message, 512, stdin); fscanf()/fprintf() file buffer로 동작 sscanf()/sprintf() string buffer로 동작. https:..
미션 1. 고객의 요청을 대기중인 서버를 만들어보자 (hint. 고객의 요청을 복사하는 서버/고객 코드) https://koyo.kr/post/c-socket-example/ 이 프로젝트를 따라해보았당 block 기다리는 행위. 어디까지 진행하고 클라이언트가 접속할때까지 기다린다? 그렇다면 블락된 것. socket() 소켓은 일종의 통신창구. 객체 내 통신의 종단점. 이 서버가 다른 서버와 통신하고 싶다면 개설하는 통로. int socket(int domain, int type, int protocol); 입력 domain : 인터넷 프로토콜 결정 type : 데이터 전송 프로토콜 결정. protocol : 소켓에 특별한 프로토콜이 필요할 경우. '소통 도메인'을 지정. 출력 새 소켓의 파일디스크립터. ..
eclipse 상에서 직접 컴파일 eclipse 에서는 저장과 실행 과정에서 이를 자동으로 처리해주어서 편리함을 느끼고 있지만, 이클립스 상에서 돌아가는 것이 궁금하다면 직접 손으로 컴파일을 해보면 된다. 우선 나는 java2 라는 파일 안에서 selfcompile.java 라는 것을 cmd 창에서 실행을 해보고자 한다. 그렇다면 해당 디렉토리로 이동해서 컴파일을 하고, java 를 실행하면 된다. src와 bin의 차이점 src 는 여러분이 코딩을 하는 소스 코드이다. bin 은 compile 된 소스코드의 class 가 위치하는 곳이다. "src" 폴더에는 일반적으로 프로젝트를 구성하는 모든 Java 클래스 및 패키지를 포함하여 프로젝트의 소스 코드가 포함된다. 코드가 컴파일되면 결과 ".class"..
다른 패키지에 class가 들어있는 상황 네가 실행하고자 하는 파일의 클래스가 다른 패키지에 들어있어서 실행이 안되는 상황이라면 import 로 해당 클래스를 추가해주면 된다. 이클립스 상에서 이러한 행위는 사실 환경변수 설정과 동일한 역할을 한다. 다음 예시로 그 이유를 알아보자. cmd 상에서 java를 실행하는데 다른 폴더에 class가 들어가있는 상황 당신이 사용해야하는 클래스가 다른 패키지인 lib(자바에서는 폴더는 패키지와 같은 역할을 수행) 안에 들어있어서 단순하게 java classpath2 명령어로 실행이 안된다고 생각해보자. 그렇다면 lib 를 어떻게 처리해야 하는가? 이렇게 쓰면 문제없이 실행이 된다. .은 현재 위치하고 있는 곳의 class 를 찾을것, lib 는 그 폴더 안도 뒤져..
String은 문자열, []는 배열 즉, args라는 이름의 문자열 배열을 사용하겠다는 뜻이다! 메인 함수에서 이 String[] args를 생략할 수 없는데 그 이유는 프로그램이 시작되는 부분이기 때문에 외부에서 값을 받을 수 있어야하기 때문(?)
그 이유는 다른 멤버들이 main에 접근해야 해서이다. 우선 public 은 접근제한자이고, 그 종류에는 public, protected, private, default가 있는데 public 모든 곳에서 접근 가능 protected 같은 패키지안의 클래스나 상속 클래스에서만 접근 가능 private 클래스 내에서만 접근 가능 default 같은 패키지 안에서만 가능 여기서 public이 쓰이는 이유는 main은 프로그램의 기본이므로 모든곳에서 접근 가능해야하다보니 main 앞엔 예외없이 public만이 가능함! 즉, 모든 클래스에서 접근 가능한 메소드임을 선언하고 시작하는것!