쥬신 님이 쓰신 글 :
: 배열로입력받은 문자들과 다시 입력을 받아 같은 글자가 있으면 삭제하는 프로그램 입니다.
: 문제는 한글자는 지워 집니다. 하지만 두글자 이상이 되면 지워 지지 않습니다. 왜그런지는 알지만 방법을 찾질 못하겠습니다.
:
:
:
: //---------------------------------------------------------------------------
: #include <stdio.h>
: #include <conio.h>
: #pragma hdrstop
:
: //---------------------------------------------------------------------------
: bool Tmain(char ich, char jch[]);
: #pragma argsused
: int main(int argc, char* argv[])
: {
: char ch1[100];
: char ch2[100];
: int i,j;
: bool bold = false;
: gets(ch1);
: gets(ch2);
:
: for(i=0;i<ch1[i]!='\0';i++)
: {
: for(j=0;j<ch2[j]!='\0';j++)
: {
:
: if(Tmain(ch1[i], ch2))
: {
:
: if(!bold)
: {
: printf("%c",ch1[i]);
: }
: }
: }
: }
:
: getch();
: return 0;
: }
:
: bool Tmain(char ich, char jch[])
: {
: for(int j=0;jch[j]!='\0';j++)
: {
: if(ich==jch[j])
: {
: return false;
: }
: }
: return true;
: }
아래의 for문의 조건절이 이상합니다.
: for(i=0;i<ch1[i]!='\0';i++)
: {
: for(j=0;j<ch2[j]!='\0';j++)
for(A ;B ;C) { D }에서
A에는 for문 시작시 한 번만 실행할 문장을 넣습니다.
B에는 for문을 계속 실행할 조건을 넣습니다. 최종적으로 bool값으로 변환할 수 있는 어떤 것이든 가능.
C에는 for문을 순회할 때마다 실행할 문장을 넣습니다.
따라서, A에 i/j가 들어갔다고 해서 B,C에 i/j가 반드시 있어야 된다는 법은 없습니다.
실행순서는 AB DCB DCB DCB DCB ....
물론, B가 false 결과를 산출하면 for문 실행을 끝냅니다.
0은 false에 해당하고 0 이외의 모든 값은 true에 해당합니다.
ch2에 존재하는 문자들을 ch1에서 제거하는 것이라면 아래와 같이 할 수도 있습니다.
#include<stdio.h>
#include<conio.h>
bool StrChr(const char* str,char ch);
void ShiftLeft(char *str);
#pragma argsused
int main(int argc, char* argv[])
{
char ch1[100];
char ch2[100];
char *p1=ch1;
gets(ch1);
gets(ch2);
while(*p1)
{
if(StrChr(ch2,*p1)) ShiftLeft(p1);
else ++p1;
}
printf("%s\r\n%s\r\n",ch1,ch2);
getch();
return 0;
}
//---------------------------------------------------------------------------
bool StrChr(const char* str,char ch)
{
while(*str)
{
if(*str++==ch) return true;
}
return false;
}
//---------------------------------------------------------------------------
void ShiftLeft(char *str)
{
while(*str)
{
*str=*(str+1);
++str;
}
}
|