掲示板利用宣言

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

 私は

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

掲示板2

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

No.24459

strstr関数の使い方
投稿者---fuku(2005/12/02 01:38:09)


いつもお世話になります
題名が質問と合致していないかもしれませんが

文字列から「。」を発見してそこで改行するプログラムを
作っているのですが思うように行きません

//サンプル
あいうえお。かきくけこ。さしすせそ。

とあれば
//結果
あいうえお。
かきくけこ。
さしすせそ。

としたいのです

自分なりに試しているうちに strstr関数を使うんじゃないか
と思ってるのですがうまく行きません
最初の「。」を発見するときのポインタを返してくるので
「あいうえお」をどうやって出力すれば良いか悩んでいます。
以下のプログラムは
サンプルに対して

//結果
かきくけこ。さしすせそ。
さしすせそ。

となってしまいます。
ご指導よろしくお願いします。
環境 VC++ 
OS XPです



#include <stdio.h>
#include <string.h>

int main(void)
{
    char test[64] = {"あいうえお。かきくけこ。さしすせそ。"};
    char* p;
    char* q;

    q = test;
    while(p = strstr(q, "。")){
        p += 2;
        q = p;
        printf("%s\n", p);
    }

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:strstr関数の使い方 24460 RAPT 2005/12/02 01:54:40
<子記事> Re:strstr関数の使い方 24461 Blue 2005/12/02 01:57:22
<子記事> Re:strstr関数の使い方 24474 かずま 2005/12/02 19:21:38


No.24460

Re:strstr関数の使い方
投稿者---RAPT(2005/12/02 01:54:40)


これは参考になりますか?

#include <stdio.h>
#include <string.h>

int main(void)
{
    char test[64] = {"あいうえお。かきくけこ。さしすせそ。"};
    char* p;
    char* q;
    char tmp;

    q = test;
    while(p = strstr(q, "。")){
        p += 2;
        tmp = *p;
        *p = '\0';
        printf("%s\n", q);
        *p = tmp;
        q = p;
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.24461

Re:strstr関数の使い方
投稿者---Blue(2005/12/02 01:57:22)


検索開始位置から、見つかったところまでの文字を
表示すればいいです。

サンプル)

#include <string.h> #include <stdio.h> int main( void ) { char s[] = "ABCD,EFG"; char word[ 32 ]; char* start = s; char* find = NULL; int len; find = strstr( start, "," ); if ( find != NULL ) { len = find - start; strncpy( word, start, len ); word[ len ] = '\0'; printf( "%s\n", word ); } return 0; }



この投稿にコメントする

削除パスワード

No.24464

Re:strstr関数の使い方
投稿者---Blue(2005/12/02 02:04:55)


ちなみにprintfで %.*s を指定すれば別バッファは必要ありません。

#include <string.h> #include <stdio.h> int main( void ) { char s[] = "ABCD,EFG"; // char word[ 32 ]; char* start = s; char* find = NULL; // int len; find = strstr( start, "," ); if ( find != NULL ) { // len = find - start; // strncpy( word, start, len ); // word[ len ] = '\0'; printf( "%.*s\n", find - start, start ); } return 0; }



この投稿にコメントする

削除パスワード

No.24465

Re:strstr関数の使い方
投稿者---fuku(2005/12/02 02:35:09)


RAPT様、Blue様
お早いご返事ありがとうございます。

>RAPT様
\0を入れて文字列を分けているんですね
tmp = *p
...
...
*p = tmp という処理は
現在 pは「かきくけこ。さしすせそ。」の先頭アドレス「か」をさしていて
「か」を tmpに保管してから \0を代入して
再び「か」を戻している
という風に解釈しました

>Blue様
>検索開始位置から、見つかったところまでの文字を
表示すればいいです。

シンプルな考えのようで、意外に思いつかないものですね
私だけでしょうか・・汗
もっと数をこなしていろんな発想ができるようになりたいです

>printf( "%.*s\n", find - start, start )
このあたりの表記は初めてみたので
勉強してみますね。

本当にありがとうございました
また何かあればよろしくお願いします。


この投稿にコメントする

削除パスワード

No.24466

Re:strstr関数の使い方
投稿者---RAPT(2005/12/02 03:25:24)


> *p = tmp  という処理は
> 現在 pは「かきくけこ。さしすせそ。」の先頭アドレス「か」をさしていて
> 「か」を tmpに保管してから \0を代入して
正確に言えば、「か」の最初の1バイト目を…というのが正解です。
ただし、このような操作ができるのは、今回のように、対象文字列が
「変更可能な配列」になっている場合のみです。

一方、Blueさんが提示されている方法は、もっと汎用的で、const char* や
文字列リテラルが対象であっても正しく動作します。

# どちらかというと、Blueさんの方法が王道、私の書いた方法は裏口的(^^;


>> printf( "%.*s\n", find - start, start )
> このあたりの表記は初めてみたので
. は精度指定で、* は精度を引数で指定することを意味します。
詳しくはリファレンスを参照してください。




この投稿にコメントする

削除パスワード

No.24474

Re:strstr関数の使い方
投稿者---かずま(2005/12/02 19:21:38)


> 環境 VC++ 
> OS XPです
ということは、文字コードはシフトJIS ですね。
これだと strstr() でうまくいかないことがあります。

#include <stdio.h>
#include <string.h>

int main(void)
{
    static char test[] = "あいうえお。かきくけこ。さしすせそ。";
    char *p, *q;

    for (p = test; q = strstr(p, "。"); p = q + 2)
        printf("%.*s\n", q - p + 2, p);
    if (*p) puts(p);

    return 0;
}

このプログラムのデータを次のように変えてみてください。

    static char test[] = "和香B90W60H90。美咲B83W58H87。栄子B91W59H87";

「香」の 2バイト目は 0x81、「B」は 0x42 で、この並びは「。」のコードに
なるからです。



この投稿にコメントする

削除パスワード

No.24478

Re:strstr関数の使い方
投稿者---fuku(2005/12/02 20:26:15)


>「香」の 2バイト目は 0x81、「B」は 0x42 で、この並びは「。」のコー>ドに
>なるからです。

こんな(偶然?)ってあるんですね(驚
こういった事も考慮に入れてコーディングできるように
なるのはいつの事やら・・・頑張ります!
※特に和香のBを表示したいときは(笑




この投稿にコメントする

削除パスワード

No.24481

Re:strstr関数の使い方
投稿者---RAPT(2005/12/02 23:53:44)


こんなとき、APIが使えるときはマルチバイト文字を扱えるAPI
を使い、APIが使用できない場合は、iskanji()などを使用した
自作関数で対処していました。


この投稿にコメントする

削除パスワード

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