C言語関係掲示板

過去ログ

No.175."1.23456" => "123456" へ変換


No.1140

文字列である文字を抜かすプログラム
投稿者---コウ(2002/03/03 00:31:24)


こんにちは、少々わからない事があるのでお尋ねします。
えと、以下のプログラムで、'.'を抜かしたものを
jに入れて表示したいのですが、結果がどうしても1@2345...となってしまうのですが・・・。
どなたか、上手い方法をご存知でしたら教えてください。

#include <stdio.h>
main()
{
char i[]="1.23456";
char j[30];
int x=0;
int y=0;

while(i[x] != '\0')
{
if(i[x]!='.')
{
j[y]=i[x];
}
x++;
y++;
}
printf("%s\n",j);
}

すいませんが、よろしくお願いいたします。

No.1142

Re:文字列である文字を抜かすプログラム
投稿者---kikk(2002/03/03 01:59:44)


ども。


y++もifの中に入れてはいかがかと。
それと、j[]の最後に'\0'を追加しないと期待した文字列としては成り立ちません。。


では。

No.1143

Re:文字列である文字を抜かすプログラム
投稿者---コウ(2002/03/03 18:46:54)


>y++もifの中に入れてはいかがかと。
>それと、j[]の最後に'\0'を追加しないと期待した文字列としては成り立ちません。。


どうもありがとうございます。
おかげさまで'.'を抜かすことには成功したのですが、
まだ無駄な文字が一文字ついてしまい、期待した文字列に成り立ちません。
申し訳ないのですが、「j[]の最後に'\0'を追加」と言うのを
もう少し詳しく教えていただけないでしょうか?
情けない限りですが具体的にどうすれば良いというのが
思い浮べる事ができません・・・。

No.1144

Re:文字列である文字を抜かすプログラム
投稿者---さと(2002/03/03 18:55:45)


 こんにちわ。
#include <stdio.h>

void main(void)
{
char i[]="1.23456";
char j[30];
int x=0;
int y=0;
int count=0;

while(i[x] != '\0')
{
if(i[x]!='.')
{
j[y]=i[x];
++y;
++count;

}


++x;

}

j[count]=0;

printf("%s\n",j);
}

まちがってるかもしれないですど、VC6では、うまくいきました。
無理やり、最後と思われるところに、0 をいれてみました。

 では、失礼します。

No.1145

Re:文字列である文字を抜かすプログラム
投稿者---C職人(2002/03/03 19:06:23)


>こんにちは、少々わからない事があるのでお尋ねします。
>えと、以下のプログラムで、'.'を抜かしたものを
>jに入れて表示したいのですが、結果がどうしても1@2345...となってしまうのですが・・・。
>どなたか、上手い方法をご存知でしたら教えてください。
>
>#include <stdio.h>
>main()
>{
> char i[]="1.23456";
> char j[30];
> int x=0;
> int y=0;
>
> while(i[x] != '\0')
> {
> if(i[x]!='.')
> {
> j[y]=i[x];
> }
> x++;
> y++;
> }
> printf("%s\n",j);
>}
>
>すいませんが、よろしくお願いいたします。
#include <stdio.h>

/*プロトタイプ宣言*/
void getResult(char*,char*);

int main(void)
{
char buf[]="1.23456";
char kekka[6+1];

/*関数コール*/
getResult(buf,kekka);

/*デバッグ用*/
printf("%s\n",kekka);

return 0;
}
/********************************************************
/*関数名 :getResult
/*引数  :buf(操作対象の配列)・・・IN
kekka(結果を入れる配列)・・・OUT
/*戻り値 :なし
/*機能  :小数点を取り除いたものを結果用の配列に格納する
/*作成日時:20020303
/*備考  :
*********************************************************/
void getResult(char* buf,char* kekka){

int i=0,j=0;

while(buf[i] != '\0'){
/*少数点でないときは操作対象の配列から結果を入れる配列に一文字コピーする*/
if(buf[i] != '.'){
kekka[j]=buf[i];
i++;
j++;
}
/*小数点のときは操作対象の配列の添え字のみ進めてやる*/
else{
i++;
}

}
/*文字列の終りをセット*/
kekka[j]='\0';
}

上記のようなやり方でどうでしょうか。
一番オーソドックスなやり方だとおもいます
どこがまずいかと申しますと小数点をみつけたときの処理において
場合分けがされていないのが原因です。
添え字を2つもうけているのはいいのですが、小数点だったときに
2つとも添え字を進めているのがまずいところです。



No.1146

Re:文字列である文字を抜かすプログラム
投稿者---C職人(2002/03/03 20:10:32)

別の方法も考えてみました。
小数点の位置を先に見つけてしまう方法です。
こちらも参考にしてみてはどうでしょうか。
#include <stdio.h>
#include <string.h>

/*プロトタイプ宣言*/
int getPos(char*);
void getResult(char *buf,char *kekka,int foundPos);

int main(void)
{
char buf[]="1.23456";
char kekka[6+1];
int foundPos=0;

/*小数点の位置を取得*/
foundPos=getPos(buf);
/*エラー処理*/
if(foundPos == -1){
fprintf(stderr,"検索文字列を見つけることができませんでした。\n");
return 1;
}
//printf("%d\n",foundPos);

/*結果を取得*/
getResult(buf,kekka,foundPos);

printf("kekka=%s\n",kekka);

return 0;
}
/********************************************************
/*関数名 :getPos
/*引数  :buf(操作対象の配列)
/*戻り値 :i :小数点が見つかった位置
-1 :見つからなかったとき
/*機能  :小数点が見つかった位置を返す
/*作成日時:20020303
/*備考  :
*********************************************************/
int getPos(char *buf){
int i=0;

/*目的の文字が見つかったときは、その位置を返す*/
while(buf[i] != '\0'){
if(buf[i]=='.'){
return i;
}
i++;
}
/*目的の文字を発見できなかったときは、-1を返す*/
return -1;
}
/********************************************************
/*関数名 :getResult
/*引数  :buf(操作対象の配列)・・・IN
kekka(結果を入れる配列)・・・OUT
foundPos(小数点が見つかった位置)・・・IN
/*戻り値 :なし
/*機能  :小数点を取り除いたものを結果用の配列に格納する
/*作成日時:20020303
/*備考  :
*********************************************************/

void getResult(char *buf,char *kekka,int foundPos){
int i=0,j=0;

while(buf[i] != '\0'){
if(i != foundPos){
kekka[j]=buf[i];
printf("%c\n",kekka[j]);
i++;
j++;
}
else{
i++;
}
}
kekka[j]='\0';
}



No.1156

Re:文字列である文字を抜かすプログラム
投稿者---コウ(2002/03/04 22:07:53)


さと様、c職人様、ご回答、どうもありがとうございました。
おかげさまで問題を解くことができました。
またなにかありましたら、申し訳ありませんがその時はよろしくお願いいたします。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved