文字列の先頭と末尾を取り除くプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マキガミ

文字列の先頭と末尾を取り除くプログラム

#1

投稿記事 by マキガミ » 17年前

こんばんは。
また、行き詰ってしまいアドバイスをお願いします。

実行例の空白除去後のabc以外の文字を消すには、
どうしたらいいでしょうか?

実行環境は、
OS:windows XP
コンパイラ:VS
です。

問題
第1引数で渡された文字列の先頭と末尾の空白文字を取り除いた文字列を第2引数で
指定された領域に設定し、取り除いた空白文字の数を戻り地として返す関数を作成。
第2引数で指定された領域は、呼び出し元で空白を取り除いた文字列を格納するのに
十分なサイズの領域が指定されているものとする。
#include  <stdio.h>
#include  <stdlib.h>

#define  NUMBER  33

int TrimStr(char str[/url], char str0[/url])
{
    int  i          = 0;
    int  j          = 0;
    int  len        = 0;	/* 文字列長 */
    int  SPcounter  = 0;	/* 空白文字のカウンター */
    int  frontDelSP = 0;	/* 先頭の空白文字数 */
    int  strEOF     = 0;	/* 第1引数の末尾の空白文字の開始場所 */

    /* 文字列長を求める */
    while (str[len] != '\0') {
        len++;
    }

    /* 先頭空白文字をカウント */
    while (str == ' ') {
        SPcounter = SPcounter + 1;
        i++;
    }
    frontDelSP = SPcounter;

    /* 末尾空白文字をカウント */
    i = len - 1;
    while (str == ' ') {
        SPcounter = SPcounter + 1;
        i--;
    }
    strEOF = i;

    /* 領域の確保 */
    str0 = malloc(len - SPcounter);

    /* 空白を取除き、順次格納 */
    i = frontDelSP;
    while (i <= strEOF) {
        str0[j] = str;
        j++;
        i++;
    }

    free(str0);

    return SPcounter;
}

int main(int argc, char* argv[/url])
{
    char  str[NUMBE[/url] = {"0"};
    char  str0[NUMBE[/url];
    int   SPnum = 0;

    printf("文字列  :");
    gets(str);

    printf("空白除去前:\"%s\"\n", str);    

    SPnum = TrimStr(str, str0);

    printf("空白除去後:\"%s\"\n", str0);

    printf("空白文字数:%d\n", SPnum);
    
    return 0;
}

実行例
文字列  :  abc
空白除去前:"  abc  "
空白除去後:"フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ  abc  "
空白文字数:4

box

Re:文字列の先頭と末尾を取り除くプログラム

#2

投稿記事 by box » 17年前

>     /* 領域の確保 */
>     str0 = malloc(len - SPcounter);
ここと

>     free(str0);
ここの必要性について説明してください。

マキガミ

Re:文字列の先頭と末尾を取り除くプログラム

#3

投稿記事 by マキガミ » 17年前

実行例のabcの文字列のみを格納するための領域を確保するためです。

box

Re:文字列の先頭と末尾を取り除くプログラム

#4

投稿記事 by box » 17年前

main関数でstr0として領域を確保済みです。
それを使えばよいです。
TrimStr関数でのmallocとfreeは、いらないです。

マキガミ

Re:文字列の先頭と末尾を取り除くプログラム

#5

投稿記事 by マキガミ » 17年前

領域確保のところ勘違いしていました。
ご指摘ありがとうございました。
何とか完成させることができました。
#include  <stdio.h>
#define  NUMBER  33

int TrimStr(char str[/url], char str0[/url])
{
    int  i          = 0;
    int  j          = 0;
    int  len        = 0;    /* 文字列長 */
    int  SPcounter  = 0;    /* 空白文字カウンター */
    int  frontDelSP = 0;    /* 先頭の空白文字数 */
    int  strEOF     = 0;    /* 第1引数の末尾の空白文字の開始場所 */

    /* 文字列長を求める */
    while (str[len] != '\0') {
        len++;
    }

    /* 先頭空白文字をカウント */
    while (str == ' ') {
        SPcounter = SPcounter + 1;
        i++;
    }
    frontDelSP = SPcounter;

    /* 文字列長、先頭空白文字数が同じ場合 */
    if (len == frontDelSP) {
        str0[0] = '\0';
        return  SPcounter;
    }
    
    /* 末尾空白文字をカウント */
    i = len - 1;
    while (str == ' ') {
        SPcounter = SPcounter + 1;
        i--;
    }
    strEOF = i;

    /* 空白を取除き、順次格納 */
    i = frontDelSP;
    while (i <= strEOF) {
        str0[j] = str;
        j++;
        i++;
    }
    str0[j] = '\0';

    return SPcounter;
}

int main(int argc, char* argv[/url])
{
    char  str[NUMBE[/url] = {"0"};
    char  str0[NUMBE[/url];
    int   SPnum = 0;

    printf("文字列  :");
    gets(str);

    printf("空白除去前:\"%s\"\n", str);    

    SPnum = TrimStr(str, str0);

    printf("空白除去後:\"%s\"\n", str0);

    printf("空白文字数:%d\n", SPnum);
    
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る