C 과제 1/2
# 문제1
[문제]
두 개의 문자열 s1, s2를 입력 받고, s1과 s2에 같은 index에 있는 문자들을 비교해서 같으면 O, 다르면 X를 출력하시오.
- 문자열의 길이는 모두 30을 넘지 않음
- 문자 비교 중 공백일 경우 X를 출력함
- 포인터 사용
[코드]
#include<stdio.h>
int main()
{
char s1[31] = { 0 }, s2[31] = { 0 };
char *p1 = &s1, *p2 = &s2;
scanf(" %s", &s1);
scanf(" %s", &s2);
while (!(*p1 == '\0' && *p2 == '\0'))
{
if (*p1 == *p2)
printf("O");
else
printf("X");
p1++;
p2++;
}
return 0;
}
[코드설명]
s1배열과 s2배열을 0으로 초기화하고, 문자열을 입력 받는다. p1과 p2는 각각 s1과 s2를 가리키고 있다. 두 포인터가 '\0'이 아니면 *p1과 *p2값을 비교하여 같으면 O, 다르면 X를 출력하고, p1과 p2의 값을 증가시킨다.
[실행 결과]
# 문제 2
[문제]
문자열 S와 숫자 N을 입력받고, 다음과 같은 규칙으로 문자열을 바꾼다.
- 맨 앞글자는 문자열의 맨 뒤로 이동한다.
- 맨 앞을 제외한 나머지 문자들은 한 칸씩 앞으로 이동한다.
- 이 규칙을 함수로 구현한다.
문자열 S를 N번 바꾼 결과를 출력하시오.
- 문자열의 길이는 30을 넘지 않고, N은 100보다 작은 양의 정수이다.
[코드]
#include<stdio.h>
#include<string.h>
void str_change(char *s, int length);
int main()
{
char S[30] = { 0 };
int N, slen;
scanf("%s", &S);
scanf("%d", &N);
slen = strlen(S);
for (; N > 0; N--)
str_change(S, slen);
printf("%s\n", S);
return 0;
}
void str_change(char *s, int length)
{
char *temp;
int i;
*(s+length) = *s;
for (i = 0, temp = s+1; i < length; i++, temp++)
*(s + i) = *temp;
s[length] = '\0';
}
[코드설명]
① main
S배열을 0으로 초기화하고, 문자열 S와 N을 입력 받는다. 그리고 str_change에 넘겨줄 인자를 위해 strlen(S)으로 S배열의 문자열 길이를 알아낸다. 그 후 for문으로 str_change(S, slen)를 N번 반복한다. 반복이 끝나면 S문자열을 출력한다.
② str_change
main()에서 문자열과 문자열의 길이를 인자로 받고 문자열의 배열을 바꾼다.
문자열 맨 앞에 있는 문자를 맨 뒤로 옮기고, for문으로 전체 문자열을 앞으로 하나씩 당겼다.
temp는 for문에서 문자를 앞으로 하나씩 당길 때, 옮겨질 문자를 가리키는 포인터로 사용했다. 마지막 문자까지 옮겨진 후에는 문자열의 맨 끝에 '\0'을 넣어서 문자열을 완성시킨다.
[실행 결과]