윤성우의 열혈 C 프로그래밍 - 배열기반의 문자열 표현[11-2]

Yumin Jung·2023년 7월 19일
0

11-2-1

#include <stdio.h>

int main(void) {
	char word[100];
	int len=0;

	printf("영단어 하나 써라 : \n\n");
	scanf_s("%s", word);

	while (word[len] != '\0')
		len++;

	printf("입력한 영단어의 길이는 : %d", len);
	return 0;
}

위 코드가 실행되지 않았다. 아주 약간의 답지를 참고하여 구현했지만, scanf_s의 문제로 해결이 되지 않았음을 발견했다.

https://blog.naver.com/wiiwiwi/222843836892

버퍼 오버플로우 : 버퍼의 한계가 있어도 일단 처리가 급하니까 다른 곳에 남겨두는 것, 출력은 잘 되지만 나중에 문제가 될 수 있다.

scanf가 버퍼 오버플로우가 일어난다고 한다. 반면에 scanf_s는 버퍼 오버플로우가 없다. 대신 버퍼를 벗어나면 저장을 하지 않는다.

이에 대한 해결 방법은

#define _CRT_SECURE_NO_WARNINGS

를 선언하고 scanf를 사용하면 된다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	char word[100];
	int len=0;

	printf("영단어 하나 써라 : \n\n");
	scanf("%s", word);

	while (word[len] != '\0')
		len++;

	printf("입력한 영단어의 길이는 : %d", len);
	return 0;
}

11-2-2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	char word[100];
	int len = 0;
	int temp;
	printf("영단어 하나 써라 : ");
	scanf("%s", word);

	while (word[len] != 0)
		len++;

	for (int a = 0; a <= len; a++) //뒤집고 또 뒤집는 꼴
    {

		temp = word[a];
		word[a] = word[len-a];
		word[len-a] = temp;

	}
	printf("\n\n");
	printf("%s", word);

	return 0;
}

결과가 나오지 않았다. 일단 for문에서 조건식에 a<=len 에서 2을 나눠줬어야 했다. 나누지 않는다면 한 번 뒤집었다가 다시 뒤집는 꼴이기 때문이다.

그리고, len-a 에 -1을 더 해줬어야 했다. 왜냐? len은 index의 번호이기 때문이다. 즉, 위의 코드는 널 문자와 첫 번째 문자를 바꾼 셈이다. 그래서 결과가 안나왔던 것이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	char word[100];
	int len = 0;
	int temp;
	printf("영단어 하나 써라 : ");
	scanf("%s", word);

	while (word[len] != 0)
		len++;

	for (int a = 0; a <= len/2; a++) {

		temp = word[a];
		word[a] = word[(len-a)-1];
		word[(len-a)-1] = temp;

	}
	printf("\n\n");
	printf("%s", word);

	return 0;
}

11-2-3

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	char voca[100];
	int len = 0, i;
	char max = 0;

	printf("영단어 입력 : ");
	scanf("%s", voca);

	while (voca[len] != '\0')
		len++;

	for (i = 0; i < len; i++)
		if (max < voca[i])
			max = voca[i];

	printf("가장 큰 아스키코드 : %c\n", max);
	return 0;
}

for (i = 0; i < len; i++)
if (max < voca[i])
max = voca[i];
이 부분에서 아스키코드 끼리 비교한다. max의 자료형도 char이기 때문이다.

profile
문과를 정말로 존중해

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

아주 유용한 정보네요!

답글 달기