C言語関係掲示板

過去ログ

No.1163 任意の文字列を入力して指定した文字列を消す

[戻る] [ホームページ]
No.15106

誰か教えてください
投稿者---しん(2004/07/01 12:43:07)


任意の文字れつを入力して 指定した文字を入力した文字を消すプログラムなのですが、
文字化けしてしまうですがどうしたらいいんでしょうか?
#include <stdio.h>
#include <stdlib.h>
char *strch(char *st, char ch)
{
while (*st!= ch && *st != 0x00)
st++;
if (*st == 0x00)
return (0x00);
return(st);
}
int strcp(char *co,char *py)
{
while(*co++=*py++);

return(0);
}
int length(char *ta)
{
int counter;
counter = 0;
while(*ta !=0x00)
{
counter++;
ta++;
}
return(counter);
}

int strcm(char *ta,char *ku)
{
while(*ta==*ku){
if(*ta==0x00)
return 0;
ta++;
ku++;
}
return(*ta-*ku);
}

char *strstring(char *str,char *ring)
{
while(1){

str=strch(str,*ring);
if(str==0x00)
return(0x00);
if(strcm(str,ring))
return(char*)str;
str++;
}
}

int deletion(char *str, char *del)
{
char *p;
int len = length(del);
while (p = strstring(str, del))
strcp(p, p + len);
return(len);
}


int main()
{
char *str;
char *work;
char *dummy;
char *dummy2;
str = (char *)malloc(50);
work= (char *)malloc(3);
dummy=str;
while(*str=getchar(),*str!=EOF){
str++;}str=0x00;
dummy2=work;
while(*work=getchar(),*work!=EOF){
work++;}work=0x00;
deletion(dummy, dummy2);
printf("%s\n",dummy);

return 0;
}


No.15107

Re:誰か教えてください
投稿者---あかま(2004/07/01 12:52:41)


>任意の文字れつを入力して 指定した文字を入力した文字を消すプログラムなのですが、
"任意の入力した文字列"の中の1文字が"入力した文字"ですか?
指定した文字って何ですか?
消すというのは何ですか?文字列を詰めるのですか?スペースか何かで埋めるのですか?


重要!!!
※ソースの添付は「HTML変換ツール」で字下げ!
もう一度ソースを貼りなおしてください。


No.15108

Re:誰か教えてください
投稿者---ぽこ(2004/07/01 12:58:46)


>任意の文字れつを入力して 指定した文字を入力した文字を消すプログラムなのですが、
>文字化けしてしまうですがどうしたらいいんでしょうか?

具体的にはどんな入力をされたのですか?

#strcpy(),strstr(),strcmp(),strlen()を利用しないのはわざと?



No.15109

Re:誰か教えてください
投稿者---ニタチ(2004/07/01 13:11:40)


>任意の文字れつを入力して 指定した文字を入力した文字を消すプログラムなのですが、
>文字化けしてしまうですがどうしたらいいんでしょうか?

 abcdeabcdeと入力して、「指定した文字」ってのをabとすると、
 cdecde
 としたいってことですか?

 とりあえず、


>char *strch(char *st, char ch)
> {
> while (*st!= ch && *st != 0x00)
> st++;
> if (*st == 0x00)
> return (0x00);
> return(st);
> }

 ってところは、
char *strch(char *st, char ch)
{
    while (*st!= ch && *st != '\0')
        st++;

    if (*st == '\0')
        return NULL;

    return(st);
}

としたほうが読みやすいです。できればブロックも。
ってか、ライブラリ関数を使わないのはなぜですか?


No.15131

Re:誰か教えてください
投稿者---しん(2004/07/02 00:02:18)


ライブラリ関数と配列を利用しないのはわざとで、任意の文字列中から特定の文字列を削除したいのです。
ニタチさんが書かれたとおりで、任意の文字列を abcdefg 、特定(指定)の文字列を ab とした場合 cdefg と表示したいのですが文字化けしてしまうのです。どう直したらいいか教えてください。お願いします。 
#include <stdio.h>
#include <stdlib.h>
char *strch(char *st, char ch)
{
while (*st!= ch && *st != 0x00)
st++;
if (*st == 0x00)
return (0x00);
return(st);
}
int strcp(char *co,char *py)
{
while(*co++=*py++);

return(0);
}
int length(char *ta)
{
int counter;
counter = 0;
while(*ta !=0x00)
{
counter++;
ta++;
}
return(counter);
}

int strcm(char *ta,char *ku)
{
while(*ta==*ku){
if(*ta==0x00)
return 0;
ta++;
ku++;
}
return(*ta-*ku);
}

char *strstring(char *str,char *ring)
{
while(1){ 

str=strch(str,*ring);
if(str==0x00)
return(0x00);
if(strcm(str,ring))
return(char*)str;
str++;
}
}

int deletion(char *str, char *del)
{
char *p;
int len = length(del);
while (p = strstring(str, del))
strcp(p, p + len);
return(len);
}


int main()
{
char *str;
char *work;
char *dummy;
char *dummy2;
str = (char *)malloc(50);
work= (char *)malloc(3);
dummy=str;
while(*str=getchar(),*str!=EOF){
str++;}str=0x00;
dummy2=work;
while(*work=getchar(),*work!=EOF){
work++;}work=0x00; 
deletion(dummy, dummy2);
printf("%s\n",dummy);

return 0;
}




No.15137

Re:誰か教えてください
投稿者---ぽこ(2004/07/02 03:03:55)


>どう直したらいいか教えてください。お願いします。 

ソースをさらっとしか読んでませんが、気になったところだけ
指摘させてもらいます。

str=0x00;
work=0x00;

上記の二箇所おかしくないですか?
*str='\0';
では?



No.15138

Re:誰か教えてください
投稿者---ぽこ(2004/07/02 03:20:17)


>文字化けしてしまうのです。

VC++.net2002にてコンパイル&実行するとmain()の下記のwhile文で
無限ループにはまるのですが。。

while(*str=getchar(),*str!=EOF){
str++;}

while文の継続条件は本当にこれであっていますか?



No.15139

Re:誰か教えてください
投稿者---あかま(2004/07/02 03:42:56)


なーんでHTML変換ツールを使ったソースがインデントされてないかな。

文字列の最後に'\0'がついてないのが文字化けの原因(たぶん)。
あとstrstringにバグあり。strcmを使うのが間違い(使えそうだけど使えない)。
abcdea
ab
なんかの入力をしてみるとわかるかと。

0x00という表現はよろしくないかと。NULLと'\0'と0がごっちゃになってませんか?

ぽこさんも書かれてますが
while(*str=getchar(),*str!=EOF){
ってどうやって入力するのでしょう?
CTRL+Zだと次のwordの入力が飛ばされたりするのですが。

char *strstring(char *str,char *ring)//strstr
{
    int i;
    char *buf,*buf2;
    while(1){ 
    
        str=strch(str,*ring);
        if(str== NULL)
            return(NULL);
        
        for(buf=str,buf2=ring;*buf==*buf2;){
            if(*buf2 == '\0') break;
            buf++;
            buf2++;
        }
        
        if(*buf2 == '\0')
            return(char*)str;
            
        str++;
    }
}

int main()
{
    char *str;
    char *work;
    char *dummy;
    char *dummy2;
    str = (char *)malloc(50);
    work= (char *)malloc(3);
    dummy=str;
    while(*str=getchar(),*str!='\n'){
        str++;
    }
    *str = '\0';
    dummy2=work;
    while(*work=getchar(),*work!='\n'){
        work++;
    }
    *work = '\0';
    deletion(dummy, dummy2);
    printf("%s\n",dummy);
    
    return 0;
}

思いのほか原因みつけるのに時間がかかった。やっぱり標準関数は偉大だね。



No.15144

ありがとうございます
投稿者---しん(2004/07/02 10:49:44)


ありがとうございます。m(__)m 上記のソースを参考に直して行ったら文字化けしなくて、abcdefgとab入力してcdefgと表示されました。


No.15170

Re:誰か教えてください
投稿者---ぽこ(2004/07/02 18:59:00)


>ぽこさんも書かれてますが
>while(*str=getchar(),*str!=EOF){
>ってどうやって入力するのでしょう?
>CTRL+Zだと次のwordの入力が飛ばされたりするのですが。

自己フォロー。
Windows系ではEOFの入力はCtrl+Zなんですね。
ずっとCtrl+Dを押して、「あれ?おかしいな?」って思ってました^^;
以下のような入力で結果が"defg"となりました。

abcdefg^Z
^Z
abc^Z
^Z