코드네임 :

C 혼공일기 8일차 (문자열과 포인터/ 문자열 연산 함수) 본문

⚙️Computer System/C

C 혼공일기 8일차 (문자열과 포인터/ 문자열 연산 함수)

비엔 Vien 2024. 1. 30. 22:25

2/1 - 어제 놂 ㅋㅋ ㅜㅜ

문자열은 배열의 구조를 가지며, 첫번째 문자의 주소로 쓰임

 

주소로 접근해서 문자열을 바꾸지 말것!! (ex. *"apple"='t' (첫번째 문자를 t로 바꿔라)

 

350p 여기서 잠깐!이 뭔 말인지 모르겟거

-> 아냐!!!! 그 최적화 여부 확인하는 코드 써보니까 바로 이해 됨 ㅋㅋㅋ 같은 문자열이면 어디에 저장해도 주소가 같네영

(같은 문자열 상수를 여러번 사용할 때 하나의 문자열에만 메모리를 저장하고 그 주소를 공유)

 

scanf는 공백문자, 탭문자, 개행문자\n 이전까지만 저장함

gets는 공백문자, 탭문자, 개행문자\n 이후까지도 저장함

fgets 함수는 gets와 똑같으나(\n의 처리방식은 다르다네요) 최대 배열 크기까지만 문자열 입력 ( 배열의 크기 확인 가능 )

 

아놔 358p fgets(name, sizeof(name), stdin); 이부분 빼먹음;;;
fgetc(stdin);만 쓰면 실행이 안되자나요;; 왜 안되나 햇네,,

 

puts : 자동 줄바꿈

fputs : 줄 바꾸지 않음

 

와!!! 12-1 문제 다맞음 헤헷

 

 

#include <string.h>

 

strcpy(복사받을곳str1, 복사할내용str2); : 문자열을 한번에 복사 대입

strncpy(복사받을 배열명, "복사할 문자열", 복사할 문자 수); : 원하는 개수의 문자만을 복사

(복사할 문자수가 1이라면 복사할 문자열의 첫번째 문자를 복사받을 곳의 첫번째 문자에 대입)

 

strcat(str,"문자열"), strncat : 문자열 뒤에 이어붙이기

 

 strlen(str) : 배열에 들어있는 문자열의 길이 확인하기

strcmp(str1, str2); : 문자열 비교 ! (아스키 코드로)

//str1이 str2보다 사전에 나중에 나오면 1 반환     if (strcmp(str1, str2) > 0)

 

//str2가 str1보다 사전에 나중에 나오면 -1 반환        if (strcmp(str1, str2) < 0)

 

//str1 == str2이면 0 반환     if (strcmp(str1, str2) == 0)

 

 

배열에 저장된 문자열 : 문자열 변수 (수정가능)

포인터로 저장된 문자열 : 문자열 상수 (수정불가)

char str[] = "lion"; //변수
char* ps = "king"; //상수

 

따라서

strcpy(ps, str);이나

strncpy(ps, str, strlen(str)); 실행 불가

(ps가 연결하고 있는 문자열 상수(king)는 바꾸면 안됨!)

 

 

 

381번 3번 문제 땜에..

그렇군..

*은 문자열에서 첫번째 하나만 가리키고,, []는 문자열 전체를 가리킨다.

 

381번 도전 실전 예제 다시

 

 

+ 문자열 배열 선언시 반드시 포인터 배열로 선언해야함