문자열
: 문자의 배열이라는 뜻, 문자 여러개가 나열된 형태
일반적으로 두가지 방법을 사용한다
- 첫번째 방법 : char string[100];
- 두번째 방법 : const char*string;
문자열 선언 방법 char mystring[100]; const char*mystr; // 포인터로 선언 |
#define _CRT_SECURE_NO_WARNINGS
: 가장 윗줄에 선언하게 되면 scanf를 사용할 수 있게 된다.
지금부터 scanf_s를 활용하지 않고 scanf를 사용한다.
선언하지 않으면 문자열 관련 함수 사용에도 제약이 있다.
특히 scanf와 scanf_s 두 함수는 문자열을 다루는 방법에 차이가 있으므로
앞으로는 scanf로 통일하여 사용한다.
#include <cstring>
: 문자열 관련 함수의 선언을 담고 있는 헤더파일
- strcpy( ... ) : 문자열을 복사하는 함수
- strcmp( ... ) : 문자열을 비교하는 함수
- strcat( ... ) : 문자열을 이어붙이는 함수
- strpos( ... ) : 문자열을 찾는 함수
strcpy( ... )
: cstring 헤더파일에 선언되어 있는 함수
문자열을 복사해주는 함수
문자열 배열에 우리가 흔히 쓰는 문자열을 집어 넣어줄 수 있는 함수
문자열을 printf 로 출력하기 위해서 사용되는 변환 문자는 %s 이다.
strcpy는 = 기호를 사용하면 정상적으로 동작하지 않음
문자열은 배열이기 때문에 문자열 하나하나의 값을 옮겨서 배열로 옮긴다.
**이 strcpy( ... ) 함수를 사용하기 위해서는
#define _CRT_SECURE_NO_WARNINGS 가
헤더파일이나 소스파일 가장 처음 부분에 있어야함**
#include "prc.hpp" int main(){ char myString[100]; // 문자열 변수 /*선언 문자열이 사용될 문자열을 최대크기를 예상을 하고 그 예상된 크기를 이렇게 지정한 후에 예상된 크기의 배열을 선언하고 배열을 활용해야 되는 것, 유동적인 배열 크기를 지정하기 위해선 포인터를 배워야한다*/ strcpy(myString, "Hello World"); // cstring 헤더파일에 선언되어 있는 함수, 문자열을 복사해주는 함수 printf("%s", myString); // 문자열 출력시 %s라는 변환 문자를 활용, 문자열을 출력할때 배열 index [100]는 필요 없다. return 0; } |
#include "prc.hpp" int main(){ char inputString[100]; printf("문자열을 입력해주세요 : "); fseek(stdin, 0, SEEK_END); scanf("%99[^\n]s", inputString); char duplicatedString[100]; strcpy(duplicatedString, inputString); //첫번째 파라미터가 문자열을 받을 배열, 두번째 파라미터가 문자열을 줄 파라미터 duplicatedString = inputString이라 보면 됨 duplicatedString에 inputString 값이 들어간다 printf("입력된 문자열은 %s 입니다.", duplicatedString); return 0; } |
scanf
scanf를 활용할 때에는 역시 변환문자를 %s 로 지정해줘야 하지만 세세한 부분이 다름
최대로 입력받을 문자열의 크기를 지정해줘야하며,
문자열을 입력받을 경우에 변수의 앞에 & (앰퍼샌드) 기호를 넣지 않는 것이 특징
이는 scanf("%99[^\n]s, myString"); 의 형태가 된다
--> 99개의 문자열을 받고 그리고 줄 바꿈 문자열은 받지 않는다.
문자열을 입력받기 위해서는 항상 이런식으로 입력을 받기 때문에 숙지
** myString 의 배열의 크기는 분명히 100인데 99까지만 받은 이유**
Null terminated String
: 일반적으로 컴퓨터 터미널에서 사용하는 문자열은 null-terminated string 이라고 한다.
있는 문자열의 끝을 null 문자열인 0 값을 집어넣어서 판단한다는 것
null 문자는 \0 을 활용해서 지정해줄 수 있다. \0은 숫자 0과 똑같은 값을 가지고 있다.
문자열은 문자로 이루어진 배열인데
그 말은 문자열 변수를 선언을 하고 각각의 원소에 a,p,p,l,e
str[0] = 'a';
str[1] = 'p';
str[2] = 'p';
str[3] = 'l';
str[4] = 'e';
이렇게 집어넣게 되고 이것을 printf로 출력하게 되면 이상한 값이 출력
그 원인은 이 프로그램을 실행하게 되면 컴퓨터의 램 메모리 내부에 문자열 변수가 존재하고
이 문자열에 하나씩 a,p,p,l,e 라는 변수의 값이 할당이 되게 됨
그리고 다섯번째 index를 벗어난 여섯 번째 index 부터는 초기화 되지않는 어떤 쓰레기값이 들어감
printf 입장에서는 0이 나오기 전까지 null 즉 null 문자인 0이 나오기 전까지
지속적으로 다음 메모리들의 문자를 출력 하게 되는 것
왜냐하면 C에서는 기본적으로 null-terminated string 이기 때문임
null 문자열이 존재하는 곳이 바로 문자열의 끝이기 때문임
이것을 정상적으로 존재하게 하기위해서는 6번째 배열 str[6]에 null 문자인 \0을 집어넣게 되면 apple 만 출력
그래서 마지막에 null 문자가 들어갈 공간을 마련해 주기 위해서 배열변수는 100개 지만
최대 99개만 사용자로부터 입력 받아 넣게 된다.
#include "prc.hpp" int main(){ char myString[100]; // 문자열 변수 scanf("%99[^\n]s", myString); // scanf를 활용할때 &를 쓰지 않음, 문자열을 받을 때는 &를 빼야함 printf("입력된 문자열은 %s 입니다.\n", myString); |
strcmp( ... )
: cstring 헤더파일에 선언되어 있는 함수
문자열 두개를 파라미터로 받아 문자열을 비교해주는 함수
strcmp (str1, str2);
리턴값은 -1, 0, 1 셋 중 하나가 나온다
- 좌측 파라미터의 문자열과 우측 파라미터에 문자열이 같다면 0을 리턴
- 좌측 파라미터의 문자열이 사전적 우선도가 높다면 -1
- 우측 파라미터의 문자열이 사전적 우선도가 높다면 1 이 리턴
- (a 라는 문자열과 b 라는 문자열을 비교했을때 a 가 사전적 우선도가 높다)
#include "prc.hpp" int main(){ char str1[100]; char str2[100]; strcpy(str1, "HelloA"); strcpy(str2, "HelloB"); int result = strcmp(str1, str2); // str1 이 사전적 우선순위가 높다 printf("%d", result); return 0; } |
연습 프로그래밍 #1
사용자로부터 문자열 두개를 입력받아
두 문자열이 같다면 true를 출력하고,
두 문자열이 다르다면 false를 출력하는 프로그램을 작성하세요
#include "prc.hpp" int main(){ char input1[100]; char input2[100]; printf("문자열을 입력하세요 : "); fseek(stdin, 0, SEEK_END); scanf("%99[^\n]s", input1); printf("문자열을 한번 더 입력하세요 : "); fseek(stdin, 0, SEEK_END); scanf("%99[^\n]s", input2); if (strcmp(input1, input2)==0){ printf("True\n"); } else { printf("False\n"); } return 0; } |
연습 프로그래밍 #2
사용자로부터 문자열 두개를 입력받아
두 문자열이 같다면 true를 출력하고,
두 문자열이 다르다면 false 를 출력하는 프로그램을 작성하세요
헤더파일 cstring에 존재하는 strcmp 함수를 사용하지 않고 만들어보세요
#include "prc.hpp" int main(){ char input1[100]; char input2[100]; printf("문자열을 입력하세요 : "); fseek(stdin, 0, SEEK_END); scanf("%99[^\n]s", input1); printf("문자열을 한번 더 입력하세요 : "); fseek(stdin, 0, SEEK_END); scanf("%99[^\n]s", input2); bool same = true; for (int i=0;;i++){ if (input1[i] == '\0') break; // i를 0부터 무한반복하고 종료조건은 여기에 따로 줌 if (input1[i] != input2[i]) same = false; // input1의 i번째 배열과 input2의 i번째 배열이 서로 다르다면 same이라는 bool변수의 값이 false가 됨 // 그리고 이것이 만약에 이 if절을 단 한 번도 거치지 않았다면 두개의 문자에 값이 같은 것이므로 same은 true에서 변함이 없는 상태로 input 부분에서 loop을 종료를 하고 그 다음에 탈출을 하게됨 } if (same == true){ printf("두 문자열은 같습니다."); } else { printf("두 문자열은 다릅니다."); } return 0; } |
과제형 연습 프로그래밍
사용자로부터 문자열을 입력받아
해당 문자열을 거꾸로 출력하는 프로그램을 작성하세요
헤더파일 cstring에 존재하는 함수를 사용하지 않고 만들어보세요
#include "prc.hpp" int main(){ char input[100]; fseek(stdin, 0, SEEK_END); scanf("%99[^\n]s", input); int index = 0; for(int i = 0; ; i++){ if (input[i] == '\0') { index = i; // 이 for loop를 다 탈출하고 난 다음은 index가 null 문자를 가리키고 있는 배열 위치 break; } } for (int i = index - 1; i >= 0; i--){ printf("%c", input[i]); } return 0; } ** loop를 돌면서 해당 문자열의 마지막 null 문자를 확인한 후 null 문자의 바로 직전 위치부터 하나씩 거꾸로 돌아가면서 문자를 하나씩 출력을 해 주면 된다 ** |
'C언어' 카테고리의 다른 글
심화 C 언어 5 (포인터 2 - 포인터를 쓰는 이유) (0) | 2021.08.01 |
---|---|
심화 C 언어 4 (포인터 1 - 기초) (0) | 2021.07.31 |
심화 C 언어 2 (각종 변수형 - 모든 코딩에서 찾아볼 수 있는 '기본 자료형') (0) | 2021.07.27 |
c언어 6 (헤더파일 / 소스파일) (0) | 2021.07.26 |
c언어 5 (형변환 / 구조체) (0) | 2021.07.08 |