게시판

검색 결과: 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문을 실행하지 않고 넘어가지 않나요?

 
UNIT 6 디버거 사용법을 익히고
F11로 한 단계씩 실행으로 프로젝트를 실행하세요.
F5 대신 F11로 하나씩 실행하고
입력을 테스트하세요.

입력
cac
정상 동작

입력
c a c
정상 동작

입력
c    a c
비정상 동작

이렇게 알 수 있습니다.


회문 판별이 true에서 false로 바뀐 순간을 확인할 수 있습니다.

하단 조사식 탭에서 원하는 식을 넣으면 값을 바로 확인할 수 있습니다.

공백 문자와 'a'를 비교하기 때문에 회문 판별이 false로 변경됩니다.

그렇다면 위에 작성한 공백이 여러 개일 때 제거하는 루틴에 버그가 있다는 뜻입니다.

공백이 반드시 한 개가 아니라 2개, 3개, 10개일 경우에도 공백을 모두 제거하고 회문 판별을 해야 합니다.

공백이 들어간 회문 판별은 코딩 테스트 입사 문제에서도 자주 나오는 기초 문제입니다.

처음 코딩을 배울 때 확실하게 공부해두면 좋습니다.

, 성 이름님이 작성
 

#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입니다. 화면에 보입니다.

온라인 심사에서도 당연히 출력 결과가 없고, 오류입니다.

배열 접근을 잘 해야 합니다.

포럼 오른쪽 상단에서 검색하면 이전 질문과 답변을 참조할 수 있습니다.