#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char text[31];
scanf("%[^\n]s", text);
int length;
length = strlen(text);
bool isPalindrome = true;
char c1;
char c2;
for (int i = 0; i < length / 2; i++)
{
if (text[i] == " ")
{
while (text[i] != " ")
{
c1 = text[i++];
}
if (c1 != text[length - 1 - i])
{
isPalindrome = false;
break;
}
}
else if (text[length - 1 - i] == " ")
{
while (text[length - 1 - i] != " ")
{
c2 = text[i--];
}
if (c2 != text[i])
{
isPalindrome = false;
break;
}
}
else if (text[i] != text[length - 1 - i])
{
isPalindrome = false;
break;
}
}
printf("%d", isPalindrome);
return 0;
}
검토 시 나오는 설명대로 코드를 짜봤는데 어디서 버그가 생기는건지 잘 모르겠어서 질문드립니다
예제 입력하면 0이 나옵니다
1. f11키 눌러서 디버거를 실행하면 scanf 함수까지만 화살표가 내려오고 한번 더 f11키를 누르면 화살표가 사라지고 디버거가 중단됩니다. 유닛6에서는 f5키 사용만 나와있어서 어떻게 해야되는지 잘 모르겠습니다.
2. 디버거 사용 시 명령 프롬프트 창에 입력값을 입력하지 못하는데 디버거 사용하면서 scanf 함수로 c a c를 입력받으려면 어떻게 해야되나요?
3.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char text[31];
scanf("%[^\n]s", text);
int length;
length = strlen(text);
bool isPalindrome = true;
for (int i = 0; i < length / 2; i++)
{
if (text[i] == " " || text[length - 1 - i] == " ")
{
while (text[i] == " ")
{
text[i] = text[i++];
}
while (text[length - 1 - i] == " ")
{
text[length - 1 - i] = text[length - 1 - i - 1];
}
if (text[i] != text[length - 1 - i])
{
isPalindrome = false;
break;
}
}
else if (text[i] != text[length - 1 - i])
{
isPalindrome = false;
break;
}
}
printf("%d", isPalindrome);
return 0;
}
while문을 다르게 했더니 공백을 여러번 검사할 수 있지만, 공백이 비대칭인 경우에는 버그가 생깁니다. c a c는 1이 나와도 c ac는 0이 나오네요. if에 ||로 조건문을 썼는데도 왜 이렇게 나올까요? text[length - 1 - i]가 공백이 아니라면 두번째 while문을 실행하지 않고 넘어가지 않나요?
F11로 실행할 때 scanf까지 실행하면
Visual Studio가 아니라 새로 뜬 명령 프롬프트 창에서 입력을 대기하고 있을 겁니다. 이때 입력하면 scanf 이후의 위치로 이동하면서 F11로 단계별로 실행할 수 있습니다.
F11로 처음부터 하나씩 실행하면 번거롭기 때문에 실무에서는 중단점을 더 많이 씁니다. 예제가 간단한 입문서에서는 F11로 전체를 실행하면서 살펴보는 것도 좋습니다.
문제를 너무 어렵게 접근하고 있습니다.
while (text[i] == " ")
{
text[i] = text[i++];
}
일단, 공백 처리가 너무 어렵습니다. 이게 무슨 뜻인지는 모르겠습니다.여기서 변수 i는 전혀 직관적이지 않습니다.
hello라는 문자열이 입력되었다면
begin 변수는 0을 가리키고, end 변수는 4를 가리키면 됩니다.
배열을 0부터 세니까요.
text[begin]에 공백이 있다면? begin을 1 증가시킨다
while(text[begin] == ' ')
begin++;
공백이 있으면 계속 증가시키면 됩니다.
마찬가지로 text[end]에 공백이 있다면 end를 1 감소시킨다.
begin, end의 문자가 공백이 아니면
이 두 문자를 비교해서 일치하면 다음 문자 위치로 이동,
일치하지 않으면 회문이 아니므로 종료
text[i] = text[i++]은
무슨 뜻인지도 알 수 없고, 지금 비교하는 문자열을 직접 조작하기 때문에 위험합니다. 더 엉망이라는 뜻입니다.
입력받은 문자열은 수정하지 않고, begin, end 인덱스만 조절하면서 문자를 비교하고, 공백을 건너 뛰고, 회문을 판별하면 됩니다.
타이핑을 귀찮아하지 말고, 직관적인 변수명을 사용해야 코드를 이해하기 쉽고 문제도 더 빨리 풀 수 있습니다.
마찬가지로 타이핑이 귀찮다고 b, e 같은 암호 같은 변수명을 써도 안 됩니다. 현업에서 그러면 바로 퇴짜입니다. 커밋한 거 롤백 당합니다.