게시판
검색 결과: 118
코드 디버깅은 따로 제공하지 않습니다.
온라인 시각화 사이트를 이용해서 코드의 동작을 시각적으로 이해하면 문제 해결에 도움을 얻을 수 있습니다.
UNIT 6 디버거 사용법을 익혀서 디버거로 값을 하나씩 살펴보는 것도 좋습니다.
포럼 오른쪽 상단에 47.5로 검색하면 이미 많은 질문과 답변이 있습니다. 이걸 참고하시면 도움이 될 겁니다.
시각화 사이트에서는 scanf 지원이 안 되니 입력 문자열을 코드에 직접 넣어서 테스트하면 됩니다.
시각화 사이트에서는 코드가 실행되지 않습니다. 무한 반복 상태라서 그렇습니다. 종료 조건이 제대로 동작하지 않습니다.
UNIT 17을 복습해주세요.
기억하시나요?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
int theans = 1;
char text[31];
scanf("%[^\n]s", text);
int length = strlen(text);
int begin = 0;
int end = length - 1;
while (begin < end)
{
while (text[begin] = ' ') {
begin++;
}
while (text[end] = ' ') {
end--;
}
if (text[begin] != text[end])
{
theans = 0;
break;
}
begin++;
end--;
}
printf("%d", theans);
return 0;
}
이렇게 코드를 짰는데 어디인지 확인해주시면 감사할 것 같습니다.
안녕하세요, 코딩도장에서 C언어를 공부하고 있는 학생입니다.
공부를 하던 도중 질문하고 싶은 것이 2가지 있어서 글을 남기게 되었습니다.
1. 47.6 심사문제 N-gram 만들기
#include <stdio.h>
#include <string.h>
int main()
{
int n;
char word[11];
scanf("%d %s",&n,word);
if(strlen(word)<n)
{
printf("wrong\n");
}
else
{
for(int i = 0 ; i < strlen(word)-(n-1) ; i++)
{
printf("%c%c%c\n",word[i],word[i+1],word[i+2]);
}
}
return 0;
}
이 문제는 처음에 이렇게 작성했는데, 틀렸다고 하더군요
그래서 마지막 반복문을
문의한 코드는 삭제합니다.
이렇게 수정하니, 정답으로 처리되더군요
여기서 궁금한 점은 위 차이점이 정답의 유무를 가질정도의 차이인지,엄연히 다른게 존재하는지 궁금합니다.
2. strcat 질문
strcat에서 두번째 인자(붙일 내용의 문자열)가 NULL값이 된 경우,
세그먼트오류(코어 덤프)가 발생했습니다.
이 오류가 뭔지 찾아보니 건드리면 안되는, 범위 밖의 메모리를 포인터로 건드린 그런 종류의 오류더군요
NULL값과 이 오류가 발생한 연관성을 찾아봐도 도저히 모르겠어서 질문드립니다.
아래는 오류가 발생한 코드입니다. (참고로 47.5 심사문제입니다.)
아래 코드에 입력값으로 "nurs es run"를 입력했을 때 기준입니다.
(주석처리한 부분을 주석해제하면 오류가 발생합니다.
원래는 while(token[count]!=NULL)대신 주석처리된 for문으로 풀려고 했습니다)
*참고로 제 코딩 환경은 replit.com이라는 클라우드 환경입니다.
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char inputword[31];
char *token[10]={NULL,};
char nospaceword[31]={NULL,};
bool issame = true;
scanf("%[^\n]s",inputword);
char *ptr = strtok(inputword," ");
int count = 0;
while(ptr!=NULL)
{
token[count]=ptr;
count++;
ptr = strtok(NULL," ");
}
count = 0;
while(token[count]!=NULL)
{
strcat(nospaceword,token[count]);
count++;
}
//strcat(nospaceword,token[3]);//이거 왜 오류나는지 찾아보자. NULL값이 scr라서 코어덤프난 것 같은데 확실한지는 모름..
// for(int i=0;i<strlen(token);i++)
// {
// strcat(nospaceword,token[i]);
// }
// ↑오류는 범위 밖 메모리 건드려서 나는 코어덤프. NULL 값 섞여서 일어난 문제같음.
for(int i=0;i<(strlen(nospaceword)/2);i++)
{
if(nospaceword[i]!=nospaceword[strlen(nospaceword)-1-i])
{
issame = false;
break;
}
}
printf("%d",issame);
return 0;
}
감사합니다!
(도장_ 관리자님이 수정함 - 원문 제출일: 수요일, 20 7월 2022, 11:56 오후)
문의한 코드는 삭제합니다.
저가 코드를 쓸데없는 곳에도 써서 좀 복잡하게 코딩한거 같기는한데 잘봐주셧으면 감사하겟습니다.
컴파일러로 돌릴때는 올바른 참을 나타내는데 이문제에 제출을 하면 틀림이 나옵니다.
설명에서 scanf로 입력받는 string의 빈칸을 제거하는 방법과는 방법이 다른거 같긴한데 제코딩의 이상한점이나 저가 간과한 점이 있다면 알려주시면 감사하겠습니다!
(도장_ 관리자님이 수정함 - 원문 제출일: 월요일, 28 2월 2022, 10:05 오후)
다음과 같은 입력 케이스에 대해서 테스트하세요.
c ab c
문의한 코드의 결과는
1
입니다.
nurs es run은 회문이니까 되지만, 나머지는 안 됩니다.
문의한 코드는 삭제합니다.
저는 위의 코드를 작성했는데
풀이에는 반복문을 사용하도록 나와있네요
꼭 반복문을 써서 풀어야 하는건가요?
(도장_ 관리자님이 수정함 - 원문 제출일: 목요일, 27 1월 2022, 9:05 오후)
해당 코드로는 심사를 통과하지 못했습니다.
nurs es run
입력을 보면 공백이 두 칸인 부분이 있습니다.
공백이 여러 개 연속될 수도 있습니다
문제를 보면 공백이 5개씩 연속으로 나올 수 있습니다.
조건문만 사용하면 '공백'을 '하나'만 제거하게 되니까 나머지 공백은 제거하기 못해서
회문 판별이 실패합니다.
반복문을 사용해서 반복문이 연달아 나오는 경우를 모두 제거하지 않으면 심사를 통과하기 어렵습니다.
반복문을 쓰지 않고 해결하는 방법도 있을 것이고,
원하는 결과만 나오면 되니까 정답은 없습니다.
그러나 해설에서는 보편적인 해법을 제시하고 있으니 해설을 참고하는 것도 방법입니다.
조금 더 부연하자면
해당 코드는 입력의 첫 글자와 끝 글자만 비교하고 무조건 종료됩니다.
통상의 회문 테스트 케이스는 앞 글자와 끝 글자가 같고, 중간 글자가 다르기 때문에 회문 여부를 판별하게 되는데, 우연히도 이런 틈새가 있어서 통과가 된 것입니다.
이제 앞 글자와 끝 글자가 다른 케이스도 추가해서 보완했습니다.
문의한 코드는 삭제합니다.
이렇게 적어서 공백이 2개 이상 들어간 조건은 깜빡하고 그냥 제출했는데요
이게 이상하게 정답으로 처리돼서 왜 정답으로 처리됐는지 고민하고 있습니다.
저대로 하면 공백은 제대로 처리가 안돼야 할 텐데 공백을 2개 이상 넣어서
nur se run 을 입력해도 제대로 1이 나와버리네요... 왜 이런 걸까요??
+ 문자 맨 앞이나 맨 뒤에 공백을 넣으면 0이 나오긴 하네요! 근데 왜 문자 사이에 들어간 공백은 무시하는걸까요??
++ 아 if 밑에 {} 괄호를 빼먹어서 걍 처음부터 for 문에 break가 걸려서 이렇게 된 것 같습니다 이 이유인 것 같아요! {} 제대로 넣으니까 공백 넣으면 틀리게 나오네요
처음 if 조건 적용할 때 첫글자랑 마지막 글자가 다르면 false로 바뀐 다음 바로 break 걸리고 첫글자랑 마지막 글자만 같으면 바로 다음줄에서 break 걸려서 nur se run도 true인 상태로 나오는 거였던 것 같습니다
(도장_ 관리자님이 수정함 - 원문 제출일: 금요일, 14 1월 2022, 3:58 오후)