ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    ホームページ    使用可能タグ一覧

No.2676

文字列から空白(スペース)を取り除く
投稿者---とも(2004/09/12 10:00:34)


おはようございます。
表題の件、以下のプログラムより良い方法はあるでしょうか。
空白が2文字続くと、1文字残ってしまいます。

int get_nospc_str(const char *str, char *nospc_str)
{
int i = 0, j = 0;
int len_str = 0;

while (*(str + i)!= NUL) {
if (isspace(*(str + i))) i++;
*(nospc_str + j) = *(str + i);
i++;
j++;
}
j++;
*(nospc_str + j) = NUL;

len_str = strlen(nospc_str);

return len_str;

}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列から空白(スペース)を取り除く 2677 pi-ta 2004/09/12 10:38:21
<子記事> Re:文字列から空白(スペース)を取り除く 2678 iijima 2004/09/12 14:50:04
<子記事> 結果:文字列から空白(スペース)を取り除く 2681 とも 2004/09/12 21:46:53


No.2677

Re:文字列から空白(スペース)を取り除く
投稿者---pi-ta(2004/09/12 10:38:21)


まず、【掲示板ご利用上の注意】に
 ※ソースの添付は「HTML変換ツール」で字下げ!
と、書いてありますよね。注意して下さい。

空白文字の判定をしている行で、iをインクリメントしているのに
>      if (isspace(*(str + i))) i++;
>      *(nospc_str + j) = *(str + i);
と、その次の行では空白文字判定をせずに、文字をコピーしています。
ですので、
>空白が2文字続くと、1文字残ってしまいます。
となってしまいます。
そこらあたりを修正するとうまくいきましたので、ちょっと考えてみて下さい。


>表題の件、以下のプログラムより良い方法はあるでしょうか。
良いかどうかは分かりませんが、普通はポインタを操作するようなので、

int get_nospc_str(const char *str, char *nospc_str)
{
    const char *s;
    char *d;
    int len_str = 0;

    s = str;
    d = nospc_str;

    while (*s) {
        if (!isspace(*s)) {
            *d = *s;
            d++;
            len_str++;
        }
        s++;
    }
    *d = NULL;

    return len_str;
}
なんてのはどうでしょうか?





この投稿にコメントする

削除パスワード

No.2678

Re:文字列から空白(スペース)を取り除く
投稿者---iijima(2004/09/12 14:50:04)


ともさんのロジック(空白を読み飛ばす)を生かすなら、朱筆部分の修正・追加が必要です。

int get_nospc_str( const char* str, char* nospc_str )
{
    int i, j;
    for( i = 0, j = 0; *( str + i ) != '\0'; i++, j++ )
    {
        while( *( str + i ) == ' ' )  // 空白が連続している間,読み飛ばす(ifをwhileに変更)
            i++;

        if( *( str + i ) == '\0' ) // これがないと,strの最後の文字が空白だったときに
            break;                   //  おかしくなる

        *( nospc_str + j ) = *( str + i );
    }
    *( nospc_str + j ) = '\0';
    return j;
}


「空白でない文字だけをnospc_strに追加していく」というように発想を変えれば、次のようになります。
 発想はpi-taさんと同じ。

int get_nospc_str( const char* str, char* nospc_str )
{
    int i, j;
    for( i = 0, j = 0; *( str + i ) != '\0'; i++ )
    {
        if( *( str + i ) != ' ' )
        {
            *( nospc_str + j ) = *( str + i );
            j++;
        }
    }
    *( nospc_str + j ) = '\0';
    return j;
}


参考:上と同じ処理を[]演算子を使って表現すれば次のとおり。

int get_nospc_str( const char* str, char* nospc_str )
{
    int i, j;
    for( i = 0, j = 0; str[ i ] != '\0'; i++ )
    {
        if( str[ i ] != ' ' )
            nospc_str[ j++ ] = str[ i ];
    }
    nospc_str[ j ] = '\0';
    return j;
}



この投稿にコメントする

削除パスワード

No.2681

結果:文字列から空白(スペース)を取り除く
投稿者---とも(2004/09/12 21:46:53)


pi-ta さん、iijima さん返信ありがとうございました。
結局、pi-ta さんのプログラムをそのまま使用させて頂きました。
iijima さんの”空白を読み飛ばすロジック”と”空白ではないロジック”のように発送を変えて見ればよかったんですね。参考になりました。

C言語で、 sendmail を介さず直接 SMTP サーバーにメールを送信するプログラムを作成しています。入力した送信アドレスから空白を取り除くことが目的でした。
以下、作成したテストプログラムです。

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

#define MAX_LEN_ADDR 64   /* lenght of address */
#define MAX_LEN_ALLADDR  512  /* lenght of all address */
#define NUL  '\0' /* determination of string */

static int get_nospc_str(const char *str, char *nospc_str);

int main(int argc, char *argv[])
{
    char    addr[MAX_LEN_ALLADDR] = " sample@who.co.jp, example@wjo.co.jp  ";
    char    nospc_addr[MAX_LEN_ALLADDR];
    int len_str = 0;
    
    fprintf(stdout, "addr(length=%d) =%s\n", strlen(addr), addr);
    
    len_str = get_nospc_str(addr, nospc_addr);
    fprintf(stdout, "addr(length=%d) =%s\n", strlen(nospc_addr), nospc_addr);
    
    return 0;

}

/*--------------------------------------------------------*/
/* function:                                              */
/*  int get_nospc_str(const char *str, char *nospc_str)   */
/* return value:                                          */
/*  length of no space string                             */
/* description:                                           */
/*  remove space character from string 'str'              */
/*--------------------------------------------------------*/
int get_nospc_str(const char *str, char *nospc_str)
{
    int len_str = 0;
    
    while (*str) {
        if (!isspace(*str)) {
            *nospc_str = *str;
            nospc_str++;
            len_str++;
        }
        str++;
    }
    *nospc_str = NUL;
    
    return len_str;

}




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    ホームページ    レンタル掲示板サービス




掲示板提供:Real Integrity