C言語での空白削除

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
x_kai
記事: 29
登録日時: 14年前
連絡を取る:

C言語での空白削除

#1

投稿記事 by x_kai » 13年前

C言語での空白の削除方法が分かりません。
また、文字列を削除するにはどうすれば良いでしょうか?

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

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

すみません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語での空白削除

#2

投稿記事 by softya(ソフト屋) » 13年前

文字列は文字の配列だということが理解できていれば自ずと分かると思います。
とりあえず、何文字目に空白があるか調べるプログラムを書いて見ませんか?
あとC言語の標準関数を使うのはなしですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: C言語での空白削除

#3

投稿記事 by x_kai » 13年前

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);
ですが、まだ分かりません。。
あと、標準関数使います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語での空白削除

#4

投稿記事 by softya(ソフト屋) » 13年前

それでは、その見つかった空白の位置を返す関数にしてみてください。
あと空白後に何文字あるか調べる関数を作ってみましょう。

それができたら、こうすれば空白文字を削除できます。
(1)空白の位置 = 空白の位置関数();
(2)空白後の文字数 = 空白後の文字数の関数(空白の位置)
(3)空白の位置から空白後の文字数分ループして文字列配列を1つ前に詰める処理。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: C言語での空白削除

#5

投稿記事 by x_kai » 13年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語での空白削除

#6

投稿記事 by softya(ソフト屋) » 13年前

int型の戻り値で配列の添字番号を返せば良いと思います。
もし無かった時は-1でどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: C言語での空白削除

#7

投稿記事 by x_kai » 13年前

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の値が帰ってきます。

box
記事: 2002
登録日時: 14年前

Re: C言語での空白削除

#8

投稿記事 by box » 13年前

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

コード:

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

コード:

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

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

空白文字が複数あった場合の対処については、Search()の仕様を一から見直す必要があるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語での空白削除

#9

投稿記事 by softya(ソフト屋) » 13年前

>まず、二つ空白が合った場合の対処が出来ません。

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

もう一つの件はboxさんの書かれたとおりですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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