文字列検索プログラムを作成しています。

ライブラリ関数の"strcmp"を利用せず、
==演算子で文字同士を照合しています。

問題がありまして、
検索文字列に一文字指定し検索しますと、
漢字にヒットしてしまいます。

例)
大文字(半角)   I
ヒットした文字  "終"の2バイト目

この状態を改善したいのですが何かよい方法を教えてください。宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 使用している文字コードによって、全く異なる処理を行う必要があるのですが、シフトJISであると仮定します。



 シフトJISの全角文字は、第1バイトが0x81~0x9F、0xE0~0xEFで始まる2バイトコードなので、調べた文字がこの範囲にあれば全角なので次のバイトをスキップすればOKです。

 標準ライブラリにこれを調べるものは無かったように思いますので、
  int issjis1( int c ) ;
のような関数を自作すればよいでしょう。
    • good
    • 0
この回答へのお礼

leaz024 様へ

お返事ありがとうございます。

やはり全角1バイト目を基準に判断するようですね。
大変参考になりました。
アドバイスどおり、
全角半角判定関数を作ってみます。

どうもありがとうございました。

お礼日時:2001/07/11 01:42

検索対象は全て小文字でしょうか?



そうであれば、
まず、1バイト目がASCII文字か判定します。
#include <ctype.h>
int isalnum(int c);
判定が成立すれば0以外の値(真)を返し、成立しなければ0を返す。

新の場合(半角文字)はそのバイトを判定し、偽であれば次のバイトを判定する。
偽の場合(半角以外文字)はそのバイトと次のバイトをスキップして、その次のバイトを判定する。
    • good
    • 0
この回答へのお礼

madman 様へ

お返事ありがとうございます。

説明不足で恐縮です。
検索対象はソースファイルを指定してテストを行っておりまして、
英数字は半角で大文字小文字を含み、
英数字以外は全角半角を含んでおります。

検索対象に大文字を含んでいる場合はどうなるのでしょうか?
大変興味がありますので、
ご負担にならなければ、回答をお願いできますでしょうか?
宜しくお願い致します。

お礼日時:2001/07/09 04:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q全て全角文字かチェックしたい

PHP Version 5.1.6を使っています。
UTF-8だと全角文字が3バイトとして扱われるので、
半角文字のチェックのままだと3倍の文字制限が必要になってしまいます。

例:
[名前] 最大全角10文字まで
半角を入力した場合:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
全角を入力した場合:あああああアア亜亜亜

半角文字だと3倍の30文字まで入力できてしまうので、
なんとかして全角文字だけ入力したかチェックする正規表現が知りたいです。

Aベストアンサー

全角文字だけ入力されるという前提ならば
http://phpspot.org/blog/archives/2005/11/php_17.html
http://ifs.seesaa.net/article/26300967.html
この辺が参考になりますかね。
鬼車が入っているかによってやり方も変わってくるかと思います。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

Qstrcmp関数などでの複数の文字列の比較

以下の例はランダムなiの値で文字列にアクセスして
その文字列がどの文字列であるかを判定しているプログラムです。

char *string[] = {
  "aaa",
  "bbb",
  "ccc",
} ;

int i = rand() % 3;

if ( strcmp( string[ i ], "aaa" ) == 0 )
{
  printf("aaaです");
}

if ( strcmp( string[ i ], "bbb" ) == 0 )
{
  printf("bbbです");
}

if ( strcmp( string[ i ], "ccc" ) == 0 )
{
  printf("cccです");
}


するとこのようにif文の羅列になってしまいます。
(strstr関数を使う場合などでも同じような感じです。)

複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

Aベストアンサー

★追記。
・指定の文字列を検索して見つかった関数(処理)を実行させます。
・この場合のサンプルを下に載せます。→前回は『rand() % 3』で直接実行していますが…。
・関数『FuncAAA()』~『FuncCCC()』と構造体は前と同じです。

サンプル:
char *find = "bbb"; ←検索する文字列をセット
int i;

for ( i = 0 ; Table[i].string != NULL ; i++ ){
 if ( !strcmp(find,Table[i].string) ){
  Table[i].pfunc(); ←見つかった文字列をここで実行します
  break;
 }
}

最後に:
・文字列が多い場合は、文字列の先頭文字(a-z)をハッシュ・キーとして検索させる方法を取れば
 高速になります。または、バイナリ・サーチという方法も有効です。
・文字列が少ない場合は、上記のサンプルのように for 文でループして比較する方が簡単ですね。
・以上。おわり。→質問者さんはこちらの『技』が知りたいのでしょう。多分?

★追記。
・指定の文字列を検索して見つかった関数(処理)を実行させます。
・この場合のサンプルを下に載せます。→前回は『rand() % 3』で直接実行していますが…。
・関数『FuncAAA()』~『FuncCCC()』と構造体は前と同じです。

サンプル:
char *find = "bbb"; ←検索する文字列をセット
int i;

for ( i = 0 ; Table[i].string != NULL ; i++ ){
 if ( !strcmp(find,Table[i].string) ){
  Table[i].pfunc(); ←見つかった文字列をここで実行します
  break;
 }
}

最後に:
・文字列が多...続きを読む

Q全角文字を PDFで変換できません。(文字化けしてしまいます。)

全角文字をPDFで変換しようとしても、文字化けしてしまいます。

LabEditorで入力したいかなる全角文字も、PDFでは「・・・」で出力されてしまいます。

また、HPからダウンロードしたファイルも、全角文字は同じように文字化けして出力されます。

使用環境は、OSはWindows XP、Acrobat Professinal 6,0です。

解決策を教えていただきたいと思います。
よろしくお願いします。

Aベストアンサー

フォントの埋め込みにはチェックが入っていますか?
印刷メニューでAdobewriterを選んで出力しても同じですか?

Q大文字の文字列→小文字の文字列

C言語初心者です。
ある演習問題をやっていて詰まっています。
自分で入力した大文字の文字列を小文字にするプログラムを作るという問題なのですが、↓の条件があり、こんがらがってしまいました。
・入力した文字列に小文字が含まれていたら、エラーと表示して再び入力を促し、0を入力するとプログラム終了という流れにする。
・ポインタ変数を使う。
・continue文を使う。
・標準ライブラリ関数は使わない。
です。

・continue文というのがよくわからない。
・宣言した関数でどの処理をすればいいのかわからない。
・大文字を小文字にするというプログラムがわからない。
(アスキーコードをどう使うのか)
でつまっています。


どなたかアドバイス・解説・模範解答・指摘などしていただけないでしょうか。
よろしくお願い致します。

Aベストアンサー

> 文字列定数の前に 構文解析エラー
> 警告: 組み込み関数 `printf' と型が矛盾します
> 警告: データ定義が型や記憶クラスを持っていません
>
> というエラーがでました
> これは何ですか・・・?

printfの直前にある } は、int main(void){ の { と対応しています。
つまり、printfは関数の外で呼び出していることになります。
また、<stdio.h>もインクルードしていないようです。

ところで、アルファベットが連続していることは規格上保証されていません。処理系不明の状況で、

> while(a<='A' && a>='Z'){
> if(a>='a' && a<='z') {
> a-='a'-'A';

といった処理は不適切です。

参考URL:http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html

QExcel/Wordなどで、一度確定した半角文字を全角文字に

Excel/Wordなどで、一度確定した半角文字を全角文字に、全角文字を半角文字にできますか?打ち直すのではなく、例えば文字を選択して、その選択した文字は変換できるとか、、
大量にデータを入れた表がありまして、全角・半角がちゃんぽんになっていて、ソートなどをかけると、ばらばらになっちゃって、どうにかしたいのですが、いまさら打ち直す時間もないし、困っています。
詳しい方、教えてください。

Aベストアンサー

WordはNo2の方が書いているので省きます。
Excelはマクロでやるのが良いかと。
メニューよりツール⇒マクロ⇒VisualBasicEditorを選択して、
エディタのメニューより挿入⇒標準モジュールを選択し、出てきた画面に
Sub 全角()
Dim 範囲 As Range
For Each 範囲 In Selection
範囲.Value = StrConv(範囲.Value, vbWide)
Next 範囲
End Sub

Sub 半角()
Dim 範囲 As Range
For Each 範囲 In Selection
範囲.Value = StrConv(範囲.Value, vbNarrow)
Next 範囲
End Sub
を貼り付けます。
その後、Excelbookに戻り、変換したい場所を選択後、ツール⇒マクロ⇒マクロにて
全角を選択してOKを押せば全角に、半角を押してOkを押せば半角になります。
頑張って下さい。

WordはNo2の方が書いているので省きます。
Excelはマクロでやるのが良いかと。
メニューよりツール⇒マクロ⇒VisualBasicEditorを選択して、
エディタのメニューより挿入⇒標準モジュールを選択し、出てきた画面に
Sub 全角()
Dim 範囲 As Range
For Each 範囲 In Selection
範囲.Value = StrConv(範囲.Value, vbWide)
Next 範囲
End Sub

Sub 半角()
Dim 範囲 As Range
For Each 範囲 In Selection
範囲.Value = StrConv(範囲.Value, vbNarrow)
Next 範囲
...続きを読む

Q文字列から文字列を検索するプログラム

現在、C言語を学習しています。

文字列から文字列を検索する関数に「strstr]がありますが、自作関数として自分で作成する方法を考えております。

文字列から文字を検索する事は出来たのですが、文字列を検索するシーケンスがわかりません。

有識者の方、御教授よろしく御願い致します。

Aベストアンサー

やり方はいくつもありますが、オーソドックスなのは:

"m文字からなる文字列 source" から "n文字からなる文字列 target" を探す----

1. int pos = 0;
2. source[pos]を起点として、文字target[0]と一致するsource[t]を探す。なければ終わり。
3. (2)で得られた位置 t からn文字がtargetと一致すれば発見(終わり)
4. pos = t+1 として(2)に戻る。

QPHP経由でMYSQLに全角文字を格納するにあたって

かなり初歩的質問かも知れませんが、ご回答頂けれ助かります。m(__)m

現在MYSQLを使用しPHPの現在のデータを格納しようと思いました。
そこで、全角文字の中に'等が入っており、これを
mysql_escape_string(
または
mysql_real_escape_string(
を使用し格納しようとしたのですが、全角文字が文字化けしてしまい、
'全角'文字'の様に真ん中の'は文字列として残したいと思ったのですが、
'全角文字の様な形式になってしまい後ろの'がなくなってしまいました。
全角文字の部分は文字化けしていて暴゜・こんな風になってしまいます。

何か解決方法はありませんでしょうか?
まだまだ初心者の為、かなり初歩的質問かも知れませんがご回答頂けたら助かります。

よろしくお願い致します。

Aベストアンサー

>その中のデータは色々な文字列が含まれるせいかうまく下記に記したソースではエラーがあちこちで出てしまいます
ソースがShift_JISなら、プログラムコードとして読み込む時点で、エラーになるし文字化けになるしで対策が大変です。
ま、それぞれ問題となる文字にせっせとバックスラッシュ\を付けて回るか、
データは、csvファイルにでも書き換えて、プログラムとしてではなく、ファイルから文字列変数に直接読み込めば、プログラム解釈における上記問題は、なんとか解決できるでしょう。
phpやmysqlの文字コード設定が変更可能なら、なるたけShift_JISは使わず、eucかutf8にすべきでしょう。

また、文字列に'を含みたいのに、\でエスケープもせずに''で括ってたりしませんよね?
$DATA[name] = '名前'ccc'さん';// これはどの文字コードでも、プログラムとしてエラー
$DATA[name] = '名前\'ccc\'さん';//ok
$DATA[name] = "名前'ccc'さん";//ok

あと、記載されたコードで気になるのは、この行 $tmp2 ってどこから出てきたのかな? $tmp[$i]の間違い?
list($bbsid,$userid) = split("\t",$tmp2);

>その中のデータは色々な文字列が含まれるせいかうまく下記に記したソースではエラーがあちこちで出てしまいます
ソースがShift_JISなら、プログラムコードとして読み込む時点で、エラーになるし文字化けになるしで対策が大変です。
ま、それぞれ問題となる文字にせっせとバックスラッシュ\を付けて回るか、
データは、csvファイルにでも書き換えて、プログラムとしてではなく、ファイルから文字列変数に直接読み込めば、プログラム解釈における上記問題は、なんとか解決できるでしょう。
phpやmysqlの文字コ...続きを読む

Q文字列の照合についての質問(C言語)

こんにちは<_ _>
文字列の照合に関する質問です。
データを探索するプログラムを作っていましたが
既存データと入力データの照合ができません。

#include<stdio.h>
#include<string.h>
#define N 10

int main(void)
{
static struct girl{
char *name;
int age;
}a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18,
"Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18};
char key[20];
int i;

printf("検索するdata ? : ");
scanf("%s",key);

for(i=0;i<N;i++){

ここの部分ですif(a[i]==key){
break;
}
}

printf("%s %d",a[i],a[i]);

return 0;
}

照合するにはどうしたらいいのでしょうか?
(#include<stdio.h>
から
 int i;までは変えてはいけないと問題にあります。)

こんにちは<_ _>
文字列の照合に関する質問です。
データを探索するプログラムを作っていましたが
既存データと入力データの照合ができません。

#include<stdio.h>
#include<string.h>
#define N 10

int main(void)
{
static struct girl{
char *name;
int age;
}a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18,
"Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18};
char key[20];
int i;

printf("検索するdata ? : ");
scanf("%s",key);

for(i=0;i<N;i++){

ここ...続きを読む

Aベストアンサー

今回は検索する文字列の文字数(長さ)が不定なので、
strcmpの方が簡単で良いと思います。
strncmpとかmemcmpとかは余裕があれば、
使ってみるといいと思います。
使い方は参考URL参照。

本題
a[i]と言うのはまだ、いわばまだ構造体の状態です。
これではgirlのnameと比較なのかageと比較なのかわかりません。

ANo.4>学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。
あえて聞きますが、何故?

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strcmp.html


人気Q&Aランキング

おすすめ情報