C言語関係掲示板

過去ログ

No.1232 文字列から前後の半角スペースをカットする

[戻る] [ホームページ]
No.16373

ぐっさん
投稿者---文字列から前後の半角スペースをカットするには(2004/08/27 01:29:01)


文字列中から、半角リーディングスペースとフォローイングスペースを
取り除きたいのですが、上手くいきません。
なんだか、見栄えもわるいのですが、スマート方法はないでしょうか。

#include <stdio.h>

main()
{
    char str[64] ;

    strncpy(str,"     abcde 12345    ",21) ;
    cut_space(str) ;
    printf("[%s]\n",str) ;
}

void cut_space(char *str_data)
{
    char   *tmp_addr ;
    int    str_len ;
    int    i ;

    /* リーディングスペース削除 */
    str_len = strlen(str_data) - 1;

    for (i=0 ; i<str_len ; i++) {
        if (*str_data != 0x20) {
            break ;
        }
        *str_data++ ;
    }

    tmp_addr = str_data ;

    /* フォローイングスペース削除 */
    str_len = strlen(str_data) - 1;
    str_data = str_data + str_len ;

    for (i=str_len; i>=0; i--) {
        if (*str_data != 0x20) {
            *(str_data + 1) = '\0' ;
            break ;
        }
        str_data-- ;
    }
    str_data = tmp_addr ;
}



No.16374

Re:ぐっさん
投稿者---かずま(2004/08/27 02:08:55)


題名と投稿者名が逆ですね。

> 文字列中から、半角リーディングスペースとフォローイングスペースを
> 取り除きたいのですが、上手くいきません。

leading spaces と trailing spaces ですね。
#include <stdio.h>

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

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

int main(void)
{
    char str[] = "     abcde 12345    ";

    trim(str);
    printf("[%s]\n", str);
    return 0;
}



No.16378

文字列から前後の半角スペースをカットするには
投稿者---ぐっさん(2004/08/27 09:43:43)


>題名と投稿者名が逆ですね。
>

すみません。
ありがとうございます。

ルーチン内では、処理がされているのですが、
mainに戻ると、リーディングスペースが取り除かれて
いないのはどうてどうしてなのですか。


No.16379

Re:文字列から前後の半角スペースをカットするには
投稿者---ごんべ(2004/08/27 10:12:30)


ぐっさんさん

リーディングスペースを削除したアドレスが
渡されていないからだと思います。

アドレスを返却すれば上手く行くと思います。

ソースを見ておもったのですが、全てスペースの場合、
NULLが帰らないと思います。


No.16381

Re:文字列から前後の半角スペースをカットするには
投稿者---ホワイト(2004/08/27 10:53:12)


ぐっさんさんのコードを書き換えるとすると
こんな感じですね

#include <stdio.h>

char* cut_space(char *str_data)
{
    char   *tmp_addr ;
    int    str_len ;
    int    i ;

    /* リーディングスペース削除 */
    str_len = strlen(str_data) - 1;

    for (i=0 ; i<str_len ; i++) {
        if (*str_data != 0x20) {
            break ;
        }
        *str_data++ ;
    }

    tmp_addr = str_data ;

    /* フォローイングスペース削除 */
    str_len = strlen(str_data) - 1;
    str_data = str_data + str_len ;

    for (i=str_len; i>=0; i--) {
        if (*str_data != 0x20) {
            *(str_data + 1) = '\0' ;
            break ;
        }
    str_data-- ;
    }
    return(tmp_addr);
}

main()
{
    char str[64] ;

    strncpy(str,"     abcde 12345    ",21) ;
    printf("[%s]\n",cut_space(str)) ;
}




No.16383

Re:文字列から前後の半角スペースをカットするには
投稿者---ホワイト(2004/08/27 10:54:57)


それとmain関数は基本的に最後に書いたほうがよいと思います。


No.16387

Re:文字列から前後の半角スペースをカットするには
投稿者---Yuki(2004/08/27 11:42:58)


>それとmain関数は基本的に最後に書いたほうがよいと思います。

なぜですか?
私はmain関数は1番上に書いたほうが良いと思います。
その関数内で、使用したい内部関数があるのであれば、main関数の前に
使用したい関数の宣言を書けば良いのではないでしょうか?
#プログラムは上から下へ流れるものですから、関数も同じように
#上から下の関数を呼ぶようにするべきではないでしょうか。


No.16388

Re:文字列から前後の半角スペースをカットするには
投稿者---ホワイト(2004/08/27 11:53:45)


>>それとmain関数は基本的に最後に書いたほうがよいと思います。
>
>なぜですか?
>私はmain関数は1番上に書いたほうが良いと思います。
>その関数内で、使用したい内部関数があるのであれば、main関数の前に
>使用したい関数の宣言を書けば良いのではないでしょうか?
>#プログラムは上から下へ流れるものですから、関数も同じように
>#上から下の関数を呼ぶようにするべきではないでしょうか。

確かに宣言をしっかりとするのでしたら問題はありません。
しかしプログラムは上から下に流れるものだからこそ
あらかじめmain関数の上に関数を書いてあげることで
ぐっさんさんのように宣言を忘れるようなことにも対応できると思っています。

まー人それぞれ好みがありますから強制ではないですが・・・


No.16389

Re:文字列から前後の半角スペースをカットするには
投稿者---ぽこ(2004/08/27 11:57:01)


>>>それとmain関数は基本的に最後に書いたほうがよいと思います。
むしろ関数のプロトタイプ宣言は必ずやるように、とアドバイスした方が良いですね。


No.16391

Re:文字列から前後の半角スペースをカットするには
投稿者---ぽこ(2004/08/27 12:53:17)


>アドレスを返却すれば上手く行くと思います。
これは問題解決にはなっても疑問解決にならないと思います。

ぐっさんさん:
引数の値渡しとアドレス渡し(参照渡し)の違いを理解しましょう。
http://www9.plala.or.jp/sgwr-t/c/sec11-2.html参照。



No.16392

Re:文字列から前後の半角スペースをカットするには
投稿者---ぐっさん(2004/08/27 12:53:50)


かずまさん、ごんべさん、ホワイさん、その他の皆様
ありがとうございます。


すべてが、スペースの場合は、1バイトのスベースが
返ってきます。
サンプル等をもとにやってみます。