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 |