게시판
검색 결과: 118
포럼 상단에 47.5를 넣으면 이전 질문과 답변을 참조할 수 있습니다.
https://dojang.io/mod/forum/search.php?id=2&search=47.5
UNIT 6을 참조해서 디버거를 사용하는 것도 좋은 방법입니다.
또한, 포럼 상단의 시각화 서비스를 이용해서 단계별로 실행하면서 시각적으로 코드의 동작을 이해하는 것도 좋습니다.
첫 번째 코드의 지적 사항을 보면
1>Z:\Project1\Project1\소스.cpp(32,25): error C2446: '!=': 'const char [2]'에서 'int'(으)로 변환되지 않았습니다.
해당 코드는
if (s1[i] != " ")
배열 안의 요소는 문자입니다. 따라서 '로 둘러 싸야 합니다.
문자와 문자열을 정확하게 구분해서 사용해야 합니다.
UNIT 9, 39를 복습하세요.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char s1[31];
char s2[31];
int count = 0;
bool b1 = true;
scanf("%[^\n]s", s1);
int i = 0, k = 0;
while (s1[i] != NULL)
{
if (s1[i] != " ")
{
s2[k] = s1[i];
k++;
count++;
}
i++;
}
for (int j = 0; j < count / 2; j++)
{
if (s2[j] != s2[count - 1 - j])
{
b1 = false;
break;
}
}
printf("%d\n", b1);
return 0;
}
이렇게 코드를 짜보았습니다.
심사문제에서 통과가 되지 않고 비주얼 스튜디오에서도 실행은 되지만 1이 나와야 할 때 0이 나옵니다. 그리고 비주얼 스튜디오로 실행하면
1>c:\project\hello\hello\hello.c(15,25): warning C4047: '!=': 'int'의 간접 참조 수준이 'void *'과(와) 다릅니다.
1>c:\project\hello\hello\hello.c(17,25): warning C4047: '!=': 'int'의 간접 참조 수준이 'char [2]'과(와) 다릅니다.
이런 글이 뜨는데 이 글이 왜 뜨는지와 제가 짠 코드 중에 어느 부분이 잘못 된건지 잘 모르겠습니다.
그리고 저 코드가 되지 않자 다르게 코드를 짜봤는데
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char s1[31];
int length = 0;
bool b1 = true;
scanf("%[^\n]s", s1);
length = strlen(s1);
for (int i = 0, k = 0; i < length / 2; i++, k++)
{
if (s1[i] != " " && s1[length - 1 - k] != " ")
{
if (s1[i] != s1[length - 1 - k])
{
b1 = false;
break;
}
}
else if (s1[i] == " " && s1[length - 1 - k] != " ")
{
i++;
if (s1[i] != s1[length - 1 - k])
{
b1 = false;
break;
}
}
else if (s1[i] != " " && s1[length - 1 - k] == " ")
{
k++;
if (s1[i] != s1[length - 1 - k])
{
b1 = false;
break;
}
}
else
{
i++;
k++;
if (s1[i] != s1[length - 1 - k])
{
b1 = false;
break;
}
}
}
printf("%d\n", b1);
return 0;
}
이것 역시 심사 통과되지 않고 비주얼 스튜디오에서도 역시 실행은 되지만 1이 나와야 할 때 0이 나오고 '간접 참조 수준~' 이런 글이 뜹니다. 이 코드는 어디가 잘못 된건가요,,,
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 같은 암호 같은 변수명을 써도 안 됩니다. 현업에서 그러면 바로 퇴짜입니다. 커밋한 거 롤백 당합니다.
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문을 실행하지 않고 넘어가지 않나요?
#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이 나옵니다
질문글 작성한 후 다시 디버깅 하면서 테스트해보다가 통과 못한 원인 발견했습니다. (공백이 2개 이상일 경우 공백이 삭제가 덜됐네요...) 질문 무시해주세요 (_ _)
======================================
코드를 아래와 같이 작성하였고, Visual Studio에서 테스트 하였을 때에는 정상적으로 동작하는 것 같은데 심사문제 통과가 되지 않습니다.
실수한 부분이 있을까요?
문의한 코드는 삭제합니다.
(도장_ 관리자님이 수정함 - 원문 제출일: 화요일, 2 2월 2021, 11:41 오후)
UNIT 6 디버거를 참조하시고,
조사식을 그림과 같이 추가하면 확인할 수 있습니다.
문자 'u'일 때 else if 안의 코드가 잘 실행됩니다.
테스트 케이스 입력
nurs es run
에 대해서 결과는 1이어야 하는데 문의한 코드는 0을 출력합니다.
디버거로 확인해보세요!
다음 검색 용어는 이 메시지의 HTML 마크업에서만 나타납니다. 47.5
배열 접근에 문제가 발생했습니다. 결과가 출력되지 않습니다.
테스트한 입력 값은 cac입니다. 화면에 보입니다.
온라인 심사에서도 당연히 출력 결과가 없고, 오류입니다.
배열 접근을 잘 해야 합니다.
포럼 오른쪽 상단에서 검색하면 이전 질문과 답변을 참조할 수 있습니다.