1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6172

条件指定で特定の文字列を抽出
投稿者---ひろぽん(2006/07/18 19:44:28)


今、C言語を学んでいるのですがちょっと詰まったところがあるので質問させていただきます。初心者ですがよろしくお願いします。

早速ですが、今if文で特定の条件を含んだ文字列を抽出する文を作成しているのですが…
例えば、アルファベットのA〜Z、a〜zを抽出します。
実際の結果としては、scanfで「123aBZ[:;+」と入力したら
「aBZ」のみ出力されるといった感じです。偽の場合、else ifで「英字無し」などと出力します。

ここで本題なのですが、英字と数字以外を抽出するにはif文の条件はどのようにすればよろしいのかを教えていただきたいです。
お願いします。


■環境
OS:Windows XP
エディタ:秀丸
コンパイラ:マイクロソフト社で配布していたフリーのもの


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:条件指定で特定の文字列を抽出 6173 επιστημη 2006/07/18 19:52:58
<子記事> Re:条件指定で特定の文字列を抽出 6175 クロ 2006/07/19 05:10:11
<子記事> Re:条件指定で特定の文字列を抽出 6178 ruby 2006/07/19 09:29:24
<子記事> Re:条件指定で特定の文字列を抽出 6179 kz3 2006/07/19 10:04:29


No.6173

Re:条件指定で特定の文字列を抽出
投稿者---επιστημη(2006/07/18 19:52:58)


>ここで本題なのですが、英字と数字以外を抽出するにはif文の条件はどのようにすればよろしいのかを教えていただきたいです。
>お願いします。

isalnum という関数(マクロ?)があります。マニュアルを読んでください。



この投稿にコメントする

削除パスワード

No.6175

Re:条件指定で特定の文字列を抽出
投稿者---クロ(2006/07/19 05:10:11)


>実際の結果としては、scanfで「123aBZ[:;+」と入力したら
>「aBZ」のみ出力されるといった感じです。偽の場合、else ifで「英字無し」などと出力します。
↓な感じではどうですか?
   char str[99];
   int i, m = 0;

   scanf("s%",str);

   for(i = 0;str[i] != '\0'; i++)
     if ( ((65 <= str[i]) && (str[i] <= 90)) || ((97 <= str[i]) && (str[i] <= 122)) ){
        printf("%c",str[i]);
        m++;
     }

  if(m == 0)
    printf("「英字無し」");





この投稿にコメントする

削除パスワード

No.6176

Re:条件指定で特定の文字列を抽出
投稿者---クロ(2006/07/19 05:19:30)


↑のソースプログラム実際に動くか確認してませんのでご了承下さい。


この投稿にコメントする

削除パスワード

No.6177

Re:条件指定で特定の文字列を抽出
投稿者---επιστημη(2006/07/19 06:00:17)


> if ( ((65 <= str[i]) && (str[i] <= 90)) || ((97 <= str[i]) && (str[i] <= 122)) ){

"わざわざ"わかりにくくすることはないでしょ。

if ( ('A' < str[i] && str[i] <= 'Z') ...



この投稿にコメントする

削除パスワード

No.6178

Re:条件指定で特定の文字列を抽出
投稿者---ruby(2006/07/19 09:29:24)


>例えば、アルファベットのA〜Z、a〜zを抽出します。

(中略)

>ここで本題なのですが、英字と数字以外を抽出するには

本当に抽出したいのは前者ですか、後者ですか?
例と本題の違いがあるので後者ですか?


この投稿にコメントする

削除パスワード

No.6179

Re:条件指定で特定の文字列を抽出
投稿者---kz3(2006/07/19 10:04:29)


>実際の結果としては、scanfで「123aBZ[:;+」と入力したら
>「aBZ」のみ出力されるといった感じです。偽の場合、else ifで「英字無し」などと出力します。

バッファにコピーするんじゃなくて、
ただ抽出したい文字を画面に表示するだけなのだから、
「一文字づつ該当する文字かどうか判断して合っていれば一文字出力する」
を末尾まで繰り返せばいいってことは分かりますか?

で、分からないのはその、「該当する文字かどうか」の部分だと思うので、
データの扱い
を読んで、「文字とは?」を理解してみてください。



この投稿にコメントする

削除パスワード

No.6183

Re:条件指定で特定の文字列を抽出
投稿者---ひろぽん(2006/07/19 21:01:44)


皆様ありがとうございます。
最近始めたという言い訳はしたくないので自分の勉強不足だというのがよくわかりました。
サイトにあるマニュアルを少し読んでみようと思います。
最初にスレッド立てたときも言い方が少し中傷的すぎたと思いました。すいません。

今回、関数を使用しており、抽出する文はこのように書いてます。
kz3さんの言っているように「一文字づつ該当する文字かどうか判断して合っていれば一文字出力する」
という風にしています。ついでに出力される文字数のカウントもしています。
ソースコードを載せてみます。


    int i=0, cnt=0;
    while(*in_moji != '\0'){
        if(*in_moji >= 'a' && *in_moji <= 'z' ||
            *in_moji >= 'A' && *in_moji <= 'Z'){
            *out_moji = *in_moji;
            out_moji++;
            cnt++;
        }
        in_moji++;
    }
    *out_moji = '\0';
    return cnt;




では、英数字以外を出力するにはどうすれば? と考えたあげくif文の中に「!」をつければいいのかなと思ったのですが、正しい結果が得られなかったのです。
英字が一緒に出力されたり、1文字しか入れていない記号が2個出力さらたり……

とりあえずレスをいただいた方のアドバイスを聞き入れこれからやってみようと思います。
ありがとうございました。何かわかることがありましたら引き続きご教授ください。



この投稿にコメントする

削除パスワード

No.6185

Re:条件指定で特定の文字列を抽出
投稿者---ruby(2006/07/19 21:43:40)


>    int i=0, cnt=0;

今回載せていただいたのが関数の全体でしたら、
変数iは一度も使われていません。
使わない変数は宣言や定義する必要がないです。
>        if(*in_moji >= 'a' && *in_moji <= 'z' ||
>            *in_moji >= 'A' && *in_moji <= 'Z'){

標準ライブラリにisalphaという関数(あるいはマクロ)があります。
せっかくですからお使いになってみてはいかがでしょう。



この投稿にコメントする

削除パスワード

No.6189

Re:条件指定で特定の文字列を抽出
投稿者---ひろぽん(2006/07/19 22:22:31)


皆様ありがとうございました。無事解決したようです!!

条件を下記に変更
> if(! isalnum(*in_moji))

■実行結果■
入力文字列は?12AB,;
英字=,;, 文字数=2

※最後の「,」が気になりますが仕様なのでしょうかね?


この投稿にコメントする

削除パスワード

No.6190

Re:条件指定で特定の文字列を抽出
投稿者---ruby(2006/07/19 22:26:14)


>※最後の「,」が気になりますが仕様なのでしょうかね?

printf関数か何かでそういう風に出力するようにしていれば、
仕様なのでしょう。


この投稿にコメントする

削除パスワード

No.6200

Re:条件指定で特定の文字列を抽出
投稿者---たかぎ(2006/07/20 15:21:15)
http://takagi.in/


>条件を下記に変更
>> if(! isalnum(*in_moji))

in_mojiの型がよく分からなかったのですが、char*であれば*in_mojiをunsigned char型にキャストした方が無難です。そうしないと、文字の値が負の場合にクラッシュするかもしれません。

もう一点、"C"ロケール以外では、isalnumはカナとかも真を返したりするので要注意です。確実に英数字だけにしたいのであれば、setlocaleで一旦"C"ロケールに設定するか、isalnum以外の方法を使った方がよいでしょう。




この投稿にコメントする

削除パスワード

No.6199

Re:条件指定で特定の文字列を抽出
投稿者---kz3(2006/07/20 14:33:11)


もう解決しちゃったから、その後のレスはチェックしていないかな...

>if文の中に「!」をつければいいのかなと思ったのですが、正しい結果が得られなかったのです。

式のどこに「!」論理否定演算子を持ってくるかで結果は異なりますから、
位置が悪いのでしょう。

isalnum()を使わない版も( 今 )きちんと出来たほうが今後のためになりますよ。

入り組んだ演算をするときは、演算子の優先順位に注意です。
入り組んだ演算をする前に、括弧で式の演算順序を明確にしたり、
数ステップに分けて演算をするなどしたほうが目には優しいです。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ