ページ 11

おねがいします!

Posted: 2009年11月23日(月) 19:32
by あや
ポインタstrが文字列の先頭要素を表している時、その文字列に含まれる数字、符号+及びー以外の文字を削除する関数 void del_char(char *str) を作成しなさい。例えば、文字列が A-+1BC2+3D/0であれば-123とする。なお符号についても、数字より前にある最初のもの以外は、削除するものとする。
っていう問題なんですが、教えてもらえませんか?

Re:おねがいします!

Posted: 2009年11月23日(月) 20:57
by kazuoni
先頭から順に見ていって、
1、現在対象の文字が符号かどうか(符号文字が出たかどうか)
2、現在対象の文字が数字かどうか→数字ならキューにpush
3、1、2を繰り返し、すべて終わったら、(あれば)符号文字とキューからpopしたものを組み合わせる

自分ならばそんな風にやるかもしれないです。

Re:おねがいします!

Posted: 2009年11月23日(月) 21:13
by AYA
すごいですね!!
1,2,3,を記号で書くとどうなりますか?

Re:おねがいします!

Posted: 2009年11月23日(月) 21:25
by kazuoni
あ、名前は変えない方がいいです。誰が質問者さんかわからなくなってしまいますから。。

>1,2,3,を記号で書くとどうなりますか?

記号・・・?

Re:おねがいします!

Posted: 2009年11月23日(月) 21:37
by あや
すみません。。。
1,2,3をemacsに打ち込む時の文字です。。。

Re:おねがいします!

Posted: 2009年11月23日(月) 21:41
by mnkr
記号・・・というのは恐らくソース(英字)のことかと思います。。。

kazuoniさんの書いていることを理解しようとしていますか?
宿題のまるなげな気がします。

Re:おねがいします!

Posted: 2009年11月23日(月) 21:54
by あや
宿題なのはあたりです。。。
やり方が全然わからなくて。。。
キューって何ですか?

Re:おねがいします!

Posted: 2009年11月23日(月) 22:12
by kazuoni
っということは、まだC言語はほぼ入門ですかね^^;
まぁ、あえてキューなんて使わなくてもいいので、忘れてください。

この掲示板の規約の通り「宿題の丸投げ」は厳禁です。
なので、考え方の一つとして、自分はNo:42554の回答を書きました。

まず、授業でどこまでやっているかを見直してください。
一番最初にポインタをと書かれているので、文字列操作の一環の宿題かなと思います。
一番簡単な考え方は、
0、関数del_charに渡された文字列(のポインタ)strを関数del_charのローカル変数である文字列配列(変数名temp)にコピーする
1、tempを先頭から最後(\0)まで探査し、(初めに登場する)記号文字(+ or -)を見つけ、その文字をstr[0]に格納する
2、tempを先頭から最後(\0)まで探査し、登場した0~9はstr[1]以降に順に格納していく
3、すべて終了したら、strの最後に'\0'を格納する

こんな感じでいいかと思います。

Re:おねがいします!

Posted: 2009年11月23日(月) 22:23
by あや
すみません。ありがとうございます。
順番通りにやって行ってみます!!!

Re:おねがいします!

Posted: 2009年11月23日(月) 22:38
by たかぎ
こんな感じでは?
#include <stdio.h>
#include <ctype.h>

void del_char(char *str)
{
	char *ss;

	for (ss = str; *ss != '\0'; ss++)
	{
		int c = (unsigned char)*ss;

		if (isdigit(c) || c == '+' || c == '-')
		{
			*str++ = c;
			break;
		}
	}
	for (; *ss != '\0'; ss++)
	{
		int c = (unsigned char)*ss;

		if (isdigit(c))
			*str++ = c;
	}
	*str = '\0';
}

int main(void)
{
	char s[/url] = "A-+1BC2+3D/0";
	del_char(s);
	puts(s);
	return 0;
}
ただし、文字列が"A-+1BC2+3D/0"のときの結果は"-1230"になります。
言外の仕様が潜んでいるかもしれませんね。

Re:おねがいします!

Posted: 2009年11月25日(水) 02:14
by あや
ありがとうございます!!!
よくわかりました。うれしいです!!!

Re:おねがいします!

Posted: 2009年12月01日(火) 23:46
by あや
すみません。この答えてもらった文中でint型の変数cに代入するのに(unsigned char)とキャストしているのはどうしてですか?わかる方お願いします。