掲示板利用宣言

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

 私は

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

掲示板2

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

No.24783

文字列の前後から半角スペース、全角スペース、タブの取り除き
投稿者---べた(2005/12/13 21:44:23)


文字列の前後に、半角スペース、全角スペース、タブが存在した
場合、取り除き、文字列のみとします。文字列中に存在する場合
は、そのままとします。

まずは、全角スペースを取り除くを作ってみました。
一応は、動いているみないなのですが、他に良い方法等があります
でしょうか。
後、半角スペース、タブも追加したいと思っています。
アドバイスお願いします。

環境
Solaris8
UNIX-C
gcc

#include <stdio.h>

#define isSJIS(c)  ((c & 0xFF ^ 0x20) - 0xA1u < 60)

void zen_trim(char *) ;

main()

{
    char str1[] = "   あいうえお@12345   " ;

    printf("before : [%s]\n",str1) ;
    zen_trim(str1) ;
    printf("after  : [%s]\n",str1) ;
}

void zen_trim(char *s)
{
    char *a, *b, *p ;

    a = s ;
    while (*a)
        if (!isSJIS(*a)) break ;
        else
            if (memcmp(s, " ", 2) == 0) a += 2;
            else break ;

    p = b = a ;
    while(*p)
        if (!isSJIS(*p)) {
            p++ ;
            b = p ;
        } else {
            if (memcmp(s, " ", 2) != 0) {
                p += 2 ;
                if (!isSJIS(*p)) b = p ;
                else {
                    b = p ;
                    *(b+1) = *(p+1) ;
                }
            } else {
                p += 2 ;
            }
        }

    while (a != b) *s++ = *a++ ;

    *s = '\0';
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列の前後から半角スペース、全角スペース、タブの取り除き 24784 かずま 2005/12/13 22:44:50
<子記事> Re:文字列の前後から半角スペース、全角スペース、タブの取り除き 24797 かずま 2005/12/14 02:51:58


No.24784

Re:文字列の前後から半角スペース、全角スペース、タブの取り除き
投稿者---かずま(2005/12/13 22:44:50)


> まずは、全角スペースを取り除くを作ってみました。
> 一応は、動いているみないなのですが、他に良い方法等があります

> char str1[] = "   あいうえお@12345   " ;

「あ」の前の半角スペースをとって、試してみてください。
今度は、元に戻して、
「5」の後の半角スペースをとって、試してみてください。


この投稿にコメントする

削除パスワード

No.24797

Re:文字列の前後から半角スペース、全角スペース、タブの取り除き
投稿者---かずま(2005/12/14 02:51:58)


#define isSJIS(c)  ((c & 0xFF ^ 0x20) - 0xA1u < 60)
#define isZenSP(p) (p[0]==" "[0] && p[1]==" "[1])

void zen_trim(char *s)
{
    char *a, *b, *p;

    for (p = s; ; )
        if (*p == ' ' || *p == '\t') p++;
        else if (isZenSP(p)) p += 2;
        else break;

    for (a = b = p; *p; p++)
        if (isSJIS(*p))
            if (isZenSP(p)) p++;
            else b = ++p + 1;
        else if (*p != ' ' && *p != '\t') b = p + 1;

    while (a != b) *s++ = *a++;
    *s = '\0';
}



この投稿にコメントする

削除パスワード

No.24799

Re:文字列の前後から半角スペース、全角スペース、タブの取り除き
投稿者---べた(2005/12/14 11:31:44)


かずまさん
ありがとうございます。

考え方、作り方は、人それぞれですが、すごいです。
シンプルでかつスマートでとても参考になります。


この投稿にコメントする

削除パスワード

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