ページ 11

C言語での空白削除

Posted: 2011年10月08日(土) 22:19
by x_kai
C言語での空白の削除方法が分かりません。
また、文字列を削除するにはどうすれば良いでしょうか?

例としては、 "AAA BBB" を"AAABBB" へ変更し、
AAAだけを削除し、"BBB"にするという感じにしたいです。

これは作っているプログラムの仕様なので、"AAA "を削除するという回答は実行できません。。

すみません。

Re: C言語での空白削除

Posted: 2011年10月08日(土) 22:43
by softya(ソフト屋)
文字列は文字の配列だということが理解できていれば自ずと分かると思います。
とりあえず、何文字目に空白があるか調べるプログラムを書いて見ませんか?
あとC言語の標準関数を使うのはなしですか?

Re: C言語での空白削除

Posted: 2011年10月08日(土) 23:02
by x_kai
softya(ソフト屋) さんが書きました:文字列は文字の配列だということが理解できていれば自ずと分かると思います。
とりあえず、何文字目に空白があるか調べるプログラムを書いて見ませんか?
あとC言語の標準関数を使うのはなしですか?
一応何文字目に空白があるか調べるプログラムを書いてみました。

コード:

        int a=0,b=0;
        char test[300] = "";
        
        printf(">>");
        fgets(test, sizeof(test), stdin);
        
        for(b=0;;b++){
            if(isspace(test[b]) != 0){
                printf("%d文字目に空白あり\n", b+1);
                a++;
            }
            
            if(test[b] == '\0'){
                break;
            }
        }
        printf("合計空白数:%d\n", a);
ですが、まだ分かりません。。
あと、標準関数使います。

Re: C言語での空白削除

Posted: 2011年10月08日(土) 23:11
by softya(ソフト屋)
それでは、その見つかった空白の位置を返す関数にしてみてください。
あと空白後に何文字あるか調べる関数を作ってみましょう。

それができたら、こうすれば空白文字を削除できます。
(1)空白の位置 = 空白の位置関数();
(2)空白後の文字数 = 空白後の文字数の関数(空白の位置)
(3)空白の位置から空白後の文字数分ループして文字列配列を1つ前に詰める処理。

Re: C言語での空白削除

Posted: 2011年10月08日(土) 23:38
by x_kai
softya(ソフト屋) さんが書きました:それでは、その見つかった空白の位置を返す関数にしてみてください。
あと空白後に何文字あるか調べる関数を作ってみましょう。

それができたら、こうすれば空白文字を削除できます。
(1)空白の位置 = 空白の位置関数();
(2)空白後の文字数 = 空白後の文字数の関数(空白の位置)
(3)空白の位置から空白後の文字数分ループして文字列配列を1つ前に詰める処理。
あの、空白の位置を返すとはどんな感じでしょうか?

Re: C言語での空白削除

Posted: 2011年10月08日(土) 23:40
by softya(ソフト屋)
int型の戻り値で配列の添字番号を返せば良いと思います。
もし無かった時は-1でどうでしょうか?

Re: C言語での空白削除

Posted: 2011年10月09日(日) 00:01
by x_kai
softya(ソフト屋) さんが書きました:int型の戻り値で配列の添字番号を返せば良いと思います。
もし無かった時は-1でどうでしょうか?
少し分からなくなってきたので、、一応ソースを上げます。

コード:

int main(void)
{
    int test;
    char mozi[100];
    
    printf(">>");
    fgets(mozi, sizeof(mozi), stdin);
    
    test = Search(mozi);
    printf("%d文字目に空白あり\n", test);
    
    return 0;
}

int Search(char str[])
{
    int i;
    int a = -1;
    
    for(i=0; ;i++){
        if(isspace(str[i]) != 0){
            a = i+1;
        }
        
        if(str[i] == '\0'){
            break;
        }
    }
    
    return a;
}
## エラー ##
・まず、二つ空白が合った場合の対処が出来ません。
・次に、何故か入力した文字 + 1の値が帰ってきます。

Re: C言語での空白削除

Posted: 2011年10月09日(日) 09:24
by box
x_kai さんが書きました: ## エラー ##
・まず、二つ空白が合った場合の対処が出来ません。
・次に、何故か入力した文字 + 1の値が帰ってきます。
fgets()で取得する文字列は、最後に'\n'(空白文字の一種)を含みます。例えば、

コード:

a b c<Enter>
と入力すると、配列には

コード:

'a', ' ', 'b', ' ', 'c', '\n', '\0'
が入ります。

今のSearch()では、文字列の途中に空白文字を見つけたとしても、
とにかく最後まで探索しています。
そして、'\n'を見つけた時点で入力した文字数(上記の例では5)+1の6を返しているのです。

空白文字が複数あった場合の対処については、Search()の仕様を一から見直す必要があるような気がします。

Re: C言語での空白削除

Posted: 2011年10月09日(日) 10:10
by softya(ソフト屋)
>まず、二つ空白が合った場合の対処が出来ません。

その事については説明がなかったので、とりあえず後回しにしました。
ちなみにどうするかというと空白が無くなるまでループすれば良いです。

もう一つの件はboxさんの書かれたとおりですね。