C언어 공부

C언어 심화 - 1 문자의 '배열'

당혜성 2025. 3. 12. 22:53
#include "Header.h"

int main() {
	
	char str[100];
	str[0] = 'a';
	str[1] = 'p';
	str[2] = 'p';
	str[3] = 'l';
	str[4] = 'e';
	str[5] = '\0';
    
	printf("%s", str);
    
    return 0;
}​
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <cmath>
#include <stdlib.h>

int main() {
	float a, b;
	char oper;
	int random
	printf("값 입력: \n");
	scanf("%f", &a);
	fseek(stdin, 0, SEEK_END);

	printf("값 입력: \n");
	scanf("%f", &b);
	fseek(stdin, 0, SEEK_END);

	printf("연산자 입력");
	scanf("%c", &oper);
	fseek(stdin, 0, SEEK_END);

	switch (oper) {
	case 'p':
		printf("a의 b제곱은 %f.3", pow(a, b));
	case 'x':
		printf("프로그램 종료");
		break;
	case 'r':
		random = rand() % 6;
		if (random == 0) {
			printf("%.3f", a + b);
		}
		else if (random == 1) {
			printf("%.3f", a - b);
		}
		else if (random == 2) {
			printf("%.3f", a * b);
		}
		else if (random == 3) {
			printf("%.3f", a / b);
		}
		else if (random == 4) {
			float result = (int)a % (int)b;
			printf("%.3f", result);
		}
		else if (random == 5) {
			printf("%.3f", pow(a, b));
		}
	default:
		break;
	}
	return 0; 
}

1. 문자의 배열

여기서 부터 난이도가 확 올라간다. cstring 라이브러리를 활용하는 것들이다.

잠깐 코드를 보도록 하자

#include "Header.h"

int main() {
	char string[100];
	strcpy(string, "hi yo");
	printf("%s", string);
    
    return 0;
    }

strcpy는 문자열을 복사하는 것이다.

 

string[100]에 대해 설명하자면, 기존에 봤던 배열과 + char 자료형이 합쳐진 문자의 배열이다.

 

여기서 string[100]은 예상된 크기의 배열을 사용해야 한다.

 

다음 scanf를 사용해서 받는 코드를 보도록 하자

#include "Header.h"

int main() {
	char string[100];
	scanf("%s", string);
	printf("%s", string);
    
    return 0;
    }

기존 우리가 알던 출력 방식인데, 여기서 조금 다르게 해야한다.

다음 코드를 보자

#include "Header.h"

int main() {
	char string[100];
	scanf("%99[^\n]s", string);
	printf("%s", string);
    
    return 0;
    }

99[^\n]이 추가되었다, 무슨 뜻인가 하면..

 

99개의 문자열을 받고, 줄바꿈을 받지 않는다 라는 뜻이다.

 

???:"scanf 사용할 때는 &를 붙이라고 하지 않았나여?"

 

특이하게도 c언어에서 문자열을 출력할 때 &를 붙이지 않고 사용해야 한다.

 

만약 &이고 사용한다면 될 수 도 있고, 안될 수 도 있다.

 

문자열 복사

다음 strcpy의 예제코드를 보도록 하자

#include "Header.h"

int main() {
	char string1[100];
	
	printf("문자열 입력");
	fseek(stdin, 0, SEEK_END);
	scanf("%s", string1);

	char string2[100];
	printf("문자열 입력");
	fseek(stdin, 0, SEEK_END);
	scanf("%s", string2);

	strcpy(string2, string1);
	printf("입력된 문자열은 %s", string2);
    
    return 0;
    }

fseek(stdin, 0, SEEK_END)는 scanf를 받을때 값이 이상하게 되지 않도록 초기화 해주는것이다.

해도되고 안해도 된다.

 

코드를 설명하면, scanf까지 문자열을 입력 받는것 까진 똗같다.

 

여기서 strcpy(string2, string1)이 있는데, 1번째 문자열을 받고 2번째 문자열을 준다.

string2는 문자열을 받고, string1은 문자열을 준다.

 

실행 해보면 알 것이다.

 

다음은 문자열 비교다

문자열 비교

문자열 비교는 strcmp를 사용한다

코드를 보자

#include "Header.h"

int main() {
	char str1[100];
	char str2[100];

	strcpy(str1, "HelloA");
	strcpy(str2, "HelloB");

	int result = strcmp(str1, str2);

	printf("%d", result);
	if (strcmp(str1, str2) == 0) {
		printf("같은 문자열");
	}
    	return 0;
}

※문자열 비교, 복사는 절대로 == 기호를 사용해선 안된다. 어자피 출력도 안된다

ex) if(str1 == str2) {

         printf("같은 문자열");

}

 

아마 값이 -1이 나올것인데, 만약 문자열이 같다면 0이 나올 것이다

 

다음은 null 문자이다

 

null 문자

null 문자는 공백 이란 뜻으로 \0 또는 0을 사용한다

예시 코드를 보자

 

#include "Header.h"

int main() {
	
	char str[100];
	str[0] = 'a';
	str[1] = 'p';
	str[2] = 'p';
	str[3] = 'l';
	str[4] = 'e';
    
	printf("%s", str);


	return 0; 
}

아마 이 코드를 똗같이 했더라면, e다음에 이상한 값이 뜨는데, 그건 null값 즉 끝 값을 설정을 안해줬기 때문이다. 이를 해결하려면 str[5] = '\0' 또는 str[5] = 0 을 넣어주면 된다

 

#include "Header.h"

int main() {
	
	char str[100];
	str[0] = 'a';
	str[1] = 'p';
	str[2] = 'p';
	str[3] = 'l';
	str[4] = 'e';
	str[5] = '\0';
    
	printf("%s", str);
    
    return 0;
}

값이 정상적으로 나왔을 것이다.

 

요약

strcpy = 문자열 복사

strcmp = 는 문자열 비교

null = \0 또는 0 으로 표기

 

연습

연습 문제를 풀어보자

더보기
더보기

사용자로부터 문자열을 두개를 입력받아 두 문자열이 같다면 true 두 문자열이 다르다면 false 를 출력하는 프로그램 작성

#include "Header.h"

int main() {
	char string1[100];
	char string2[100];

	printf("문자열 입력");
	fseek(stdin, 0, SEEK_END);
	scanf("%s", string1);

	printf("문자열 입력");
	fseek(stdin, 0, SEEK_END);
	scanf("%s", string2);

	if (strcmp(string1, string2) == 0) {
		printf("true");
	}
	else {
		printf("false");
	}


	return 0; 

}

 

더보기
더보기

사용자로부터 문자열을 두개 입력받아 두 문자열이 같다면 true 다르다면 false를 출력하고, 해더파일 cstring에 존재하는 strcmp 함수를 사용하지 않고 만드시오

 

#include "Header.h"

int main() {
	char string1[100];
	char string2[100];

	printf("문자열 입력");
	fseek(stdin, 0, SEEK_END);
	scanf("%s", string1);

	printf("문자열 입력");
	fseek(stdin, 0, SEEK_END);
	scanf("%s", string2);

	bool same = true;
	for (int i = 0; ; i++) {
		if (string1 == '\0') break; 
		if (string1[i] != string2[i]) same = false
	}
	if (same == true) {
		printf("두 문자열은 같다");
	}
	else {
		printf("두 문자열은 다르다");
	}


	return 0; 

}

설명을 하자면

for (int i = 0; ; i++) {
if (string1 == '\0') break; 
if (string1[i] != string2[i]) same = false
}

이렇게 코드가 있는데, 

 

for (int i = 0; ; i++) i를 0부터 반복하고

 

if (string1 == '\0') break;  여기는 종료 조건이다

 

if (string1[i] != string2[i]) same = false; string1의 i번째 배열과 string2 의 i번째 배열이 서로 다르다면

bool 변수의 값이 false가 된다

 

만약 if절을 단 한번도 거치지 않았다면, 문자열이 같다는 뜻이므로, true가 되고 for문을 탈출하게 된다

 

좀 어려웠을거라 생각한다. 나도 문자열은 잘 못한다

 

이번엔 문제가 없다. 나도 못풀었기 때문. 다음 회독때는 반드시..