ページ 1 / 1
文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 00:58
by じゃが
文字列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;
}
自分なりに考えてみたのですが途中で訳が分からなくなり、コンパイルもできない状態になってしまいました;
また、別件なんですがポインタについての理解が浅く、なにか良いサイト・本・イメージなどお勧めの物はありますか?
よろしくお願いします。
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 01:59
by pooka
こんな感じでしょうか?
#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の添字を返す関数
Posted: 2009年4月01日(水) 06:38
by 朽木
番兵まで辿り着いたら-1で良いのでは@@
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 06:57
by たかぎ
そんな面倒なことをしなくても、
int strch_idx(const char* s, char c)
{
const char* ss = std::strchr(s, c);
return ss != 0 ? ss - s : -1;
}
でよいのでは?
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 10:57
by pooka
番兵法は以前学校で習った気がします;
strchrという関数があるんですね。
勉強になります。φ(..;)
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 18:02
by dic
#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) );
}
パッパとつくったのですがどうでしょうか?
ポインタはサイトより一冊の本を納得がいくまで読み返しましたね
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 18:33
by SCI
文字定数が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になるような文字がたまたまあった場合は困りますが、具体的にそのような文字が思いつかないので触れないでおきます(笑
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 18:37
by dic
そうですね 0x00 か \0 かで迷いましたが
マルチバイトにも対応できるstrchrの方がいいかもしれないですね
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 18:44
by SCI
まず、CとC++では文字定数の型が異なります。文字定数をcharとしている以上、比較もchar定数とした方がいいでしょう。
また、char型がunsigned charかsigned charか分からないので、多バイト文字が0x80以上の値を表す1バイト長ビット列をもつとき、「str > 0」ではじかれてしまいます。
少なくとも、私の環境ではsigned charなので、先頭にかな文字をおくとすべて-1が返りました。
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 18:48
by たかぎ
マルチバイト文字を同列に扱うのは困難です。
ワイド文字なら同列に扱える可能性があります。
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 20:05
by dic
文字列sが日本語などマルチバイトの場合
私のソースでは正常に作動しませんね
すいませんでした
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 20:44
by dic
改良版を作りました
#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の添字を返す関数
Posted: 2009年4月01日(水) 20:54
by じゃが
たくさんの回答ありがとうございます。
すいません、C++かC言語書いていませんでしたね。。C++でお願いします。
なるほど、strchr(s,c)はsの文字列のcを探すということでしょうか?
だとしたら
const char* ss = std::strchr(s, c);
この部分は分かるのですが、
return ss != 0 ? ss - s : -1;
この部分が分からないです;
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月01日(水) 21:08
by 初級者
!=0
で、見つかったかどうかを判定しています。
見つかったら、
ss-s
で、何バイト目で見つかったかを求めています。見つからなかったら-1を返します。
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月02日(木) 01:23
by じゃが
ありがとうございます。
ようやく理解できました;
ポインタの方も頑張って覚えてみようと思います。
ただpookaさんが教えてくださったサイトはC言語みたいなんですがC++しか勉強していない私でも大丈夫でしょうか?
dicさんの勉強方法ですと、やはり数回読んだだけではダメですね;
何回も読み直してみます。
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月02日(木) 14:40
by pooka
Cもわかるつもりで紹介してしまいました(^^;
すみませんm(_ _)m
C++は最近勉強し始めたばかりで詳しいことは分かりませんが、
ポインタの概念というかイメージは同じだと思うので、
サイトを見て少しでもイメージをつかんで頂ければと思い紹介しました。
Re:文字列sに含まれる最も先頭に位置する文字cの添字を返す関数
Posted: 2009年4月02日(木) 18:56
by じゃが
すいません、C++しか勉強してないんですよね。。
確かに、読んだところ少し理解ができた気がします。
理解できるように頑張ります。