文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
じゃが

文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#1

投稿記事 by じゃが » 16年前

文字列sに含まれる最も先頭に位置する文字cの添字を返す関数strch_idxをつくり
int strch_idx(const char *s, char c);
文字cが含まれない場合は-1を返すように作りたいです。
int strch_idx(const char* s,char c);

int main(){
	char s[50],c;

	cout << "文字列s:";
	cin >> s;

	strch_idx(s,c);

	cout << s[0];
}

int strch_idx(const char* s,char c){
		while(s)
			c = 1;
	return c;
}
自分なりに考えてみたのですが途中で訳が分からなくなり、コンパイルもできない状態になってしまいました;

また、別件なんですがポインタについての理解が浅く、なにか良いサイト・本・イメージなどお勧めの物はありますか?
よろしくお願いします。

pooka

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#2

投稿記事 by pooka » 16年前

こんな感じでしょうか?
#include <iostream>

using namespace std;

int strch_idx(const char *s,char c);

int main(void){
	char s[50],c;
	int n;
	
	cout << "文字列s:";
	cin >> s;
	cout << "文字c:";
	cin >> c;

	if((n = strch_idx(s,c)) == -1)
		cout << "エラー" << endl;
	else
		cout << "添字:" << n << endl;

	return 0;
}

int strch_idx(const char *s,char c){
	int count = 0;

	while(s[count] != '\0'){
		if(s[count] == c)
			return count;
		++count;
	}

	return -1;
}
文字cも入力してもらうようにして、strch_idx関数で文字cと一致したときの添字を返すようにしています。
一致しなかったときは-1を返して、「エラー」と表示するようにしました。
(もし意図した事と違っていたらごめんなさい・・・)

>ポインタについて
私は以下のサイトが分かりやすかったです。

ttp://homepage3.nifty.com/mmgames/c_guide/

朽木

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#3

投稿記事 by 朽木 » 16年前

番兵まで辿り着いたら-1で良いのでは@@

たかぎ

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#4

投稿記事 by たかぎ » 16年前

そんな面倒なことをしなくても、
int strch_idx(const char* s, char c)
{
  const char* ss = std::strchr(s, c);
  return ss != 0 ? ss - s : -1;
}
でよいのでは?

pooka

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#5

投稿記事 by pooka » 16年前

番兵法は以前学校で習った気がします;

strchrという関数があるんですね。
勉強になります。φ(..;)

dic

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#6

投稿記事 by dic » 16年前

#include <stdio.h>

int		strch_idx( const char *str, char c )
{
	int	i;
	for( i=0; str>0; i++ )
	{
		if( str == c )
			return i;
	}

	return -1;
}

void	main()
{
	char	*s1 = "This is string1.";
	char	c = 's';
	char	c2= 'g';
	char	c3= 'z';

	printf( "%d\n", strch_idx( s1, c ) );
	printf( "%d\n", strch_idx( s1, c2) );
	printf( "%d\n", strch_idx( s1, c3) );

}

パッパとつくったのですがどうでしょうか?
ポインタはサイトより一冊の本を納得がいくまで読み返しましたね

SCI

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#7

投稿記事 by SCI » 16年前

文字定数がchar型ということでC++と仮定しますと、それを書くなら
#include <stdio.h>

int strch_idx(const char *str, char c)
{
	for (int i = 0; str != '\0'; i++)
	{
		if (str == c) return i;
	}
	return -1;
}

int main()
{
	char *s1 = "テストThis is string1.";
	char c1 = 's';
	char c2 = 'g';
	char c3 = 'z';

	printf("%d\n", strch_idx(s1, c1));
	printf("%d\n", strch_idx(s1, c2));
	printf("%d\n", strch_idx(s1, c3));
}

strに多バイト文字が含まれないとは限らないので、こんな感じです。
これでも最下位バイトが0x00になるような文字がたまたまあった場合は困りますが、具体的にそのような文字が思いつかないので触れないでおきます(笑

dic

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#8

投稿記事 by dic » 16年前

そうですね 0x00 か \0 かで迷いましたが
マルチバイトにも対応できるstrchrの方がいいかもしれないですね

SCI

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#9

投稿記事 by SCI » 16年前

まず、CとC++では文字定数の型が異なります。文字定数をcharとしている以上、比較もchar定数とした方がいいでしょう。
また、char型がunsigned charかsigned charか分からないので、多バイト文字が0x80以上の値を表す1バイト長ビット列をもつとき、「str > 0」ではじかれてしまいます。
少なくとも、私の環境ではsigned charなので、先頭にかな文字をおくとすべて-1が返りました。

たかぎ

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#10

投稿記事 by たかぎ » 16年前

マルチバイト文字を同列に扱うのは困難です。
ワイド文字なら同列に扱える可能性があります。

dic

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#11

投稿記事 by dic » 16年前

文字列sが日本語などマルチバイトの場合
私のソースでは正常に作動しませんね
すいませんでした

dic

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#12

投稿記事 by dic » 16年前

改良版を作りました
#include <stdio.h>
#include <string.h>

void	main()
{
	char	*s = "テストthis is string.\n";

	printf( "searching 'z'...\n" );
	char	*p = strchr( s, 'z' );

	if( p == NULL )
		printf( "-1\n" );
	else
		printf( "%s\n", p );
}
これを関数化すれば目的は達成できますね

じゃが

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#13

投稿記事 by じゃが » 16年前

たくさんの回答ありがとうございます。
すいません、C++かC言語書いていませんでしたね。。C++でお願いします。

なるほど、strchr(s,c)はsの文字列のcを探すということでしょうか?
だとしたら
const char* ss = std::strchr(s, c);
この部分は分かるのですが、
return ss != 0 ? ss - s : -1;
この部分が分からないです;

初級者

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#14

投稿記事 by 初級者 » 16年前

!=0
で、見つかったかどうかを判定しています。
見つかったら、
ss-s
で、何バイト目で見つかったかを求めています。見つからなかったら-1を返します。

じゃが

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#15

投稿記事 by じゃが » 16年前

ありがとうございます。
ようやく理解できました;

ポインタの方も頑張って覚えてみようと思います。
ただpookaさんが教えてくださったサイトはC言語みたいなんですがC++しか勉強していない私でも大丈夫でしょうか?

dicさんの勉強方法ですと、やはり数回読んだだけではダメですね;
何回も読み直してみます。

pooka

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#16

投稿記事 by pooka » 16年前

Cもわかるつもりで紹介してしまいました(^^;
すみませんm(_ _)m
C++は最近勉強し始めたばかりで詳しいことは分かりませんが、
ポインタの概念というかイメージは同じだと思うので、
サイトを見て少しでもイメージをつかんで頂ければと思い紹介しました。

じゃが

Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数

#17

投稿記事 by じゃが » 16年前

すいません、C++しか勉強してないんですよね。。
確かに、読んだところ少し理解ができた気がします。
理解できるように頑張ります。

閉鎖

“C言語何でも質問掲示板” へ戻る