タイムマシーンがあったら、過去と未来どちらに行く?

C言語を勉強しはじめて間もない者です。
文字列から空白を取り除く(空白は左に詰めることで埋める)処理をしたいのですが、下記のようなやり方でうまくできなくて困っています。
↓を実行すると" 1234"なら"12344"になるはずだったのですが、うまくいきません。何がおかしいのでしょうか??
よろしければご教授願います。
※文字列は半角のみ想定しています。

int i = 0;
char str[] = " 1 23 4 5";
char *p;

p = str;

  while( *p != '\0' ){
    if ( isspace(*p) != 0 ){
      while( *(p + i + 1) != '\0' ){
        *(p + i) = *(p + i + 1);
        i++;
      }
    }
    p++;
  }
 

A 回答 (4件)

#3です。


先の回答と全く同じ動作をするコードです。
コメントを付けましたので、読んでみてください。

#include <stdio.h>
#include <ctype.h>

void TrimSpace(char *str)
{
char *p = str;// 当該文字列の先頭を指すポインターを用意する

while (*str != '\0') {// 当該文字列の末尾に到達しない間、処理を続ける
if (!isspace(*str)) {// 着目している文字が空白でなければ
*p = *str;// その文字を答えに格納する
p++;// 答えのポインターを1つ進める
}
str++;// 当該文字列用のポインターは、とにかく1つ進める
}
*p = '\0';// 答えの文字列を終端させる
}

int main(void)
{
char str[] = " 1 23 4 5";

printf("空白を詰める前:\"%s\"\n", str);
TrimSpace(str);
printf("空白を詰めた後:\"%s\"\n", str);
return 0;
}
    • good
    • 0
この回答へのお礼

ご丁寧にありがとございます!
凄くわかりやすいです。
これからも勉強に勤しもうと思います。
ありがとうございました!

お礼日時:2008/09/28 22:14

> 詰める過程で"123455555"とまず表示させたかったのです。



これがなぜ必要なのかわかりませんが、省略してもよいのであれば、
こんなのでどうでしょう。

#include <stdio.h>
#include <ctype.h>

void TrimSpace(char *str)
{
char *p;

for (p = str; *str; str++) {
if (!isspace(*str)) {
*p++ = *str;
}
}
*p = '\0';
}

int main(void)
{
char str[] = " 1 23 4 5";

printf("空白を詰める前:\"%s\"\n", str);
TrimSpace(str);
printf("空白を詰めた後:\"%s\"\n", str);
return 0;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>> 詰める過程で"123455555"とまず表示させたかったのです。
>
>これがなぜ必要なのかわかりませんが、省略してもよいのであれば、
>こんなのでどうでしょう。

詰める工程を確認しようと思いまして…。

ふむふむ。。
も、もう少し簡単というか易しい書き方にできませんか?(._.)
ってちょっとずうずうしいですよね。
自分で書いた物と比べてドコがダメだったのか探したかったのですが、ちょっと難しいです。。

お礼日時:2008/09/28 21:57

身近にC言語の実行環境がないので試してないのですが、


プログラムを見る限り"i"の初期化の位置が悪いです。
プログラムの先頭では初期化せず

int i;

と宣言のみにしてif文の下にi=0を入れると良いと思います。
yucchi1114さんのプログラムだと、最初の空白が見つかったときは、後ろ文字を前に詰めますが、二つ目の空白が見つかり再びif文の中に入ってきたときは、iは初期化されていないので、前回の数からプラスされていきます。

  while( *p != '\0' ){
    if ( isspace(*p) != 0 ){
      i=0;  /* ここでiを初期化 */
      while( *(p + i + 1) != '\0' ){

以上
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
うっかりミスです。
実際にはその位置でiを初期化していたんですが、投稿の際に打ち損ねてしまいました。
(ソースは投稿しているPCに無く、手元の印刷したソースを見ながら打っていたので。)

お礼日時:2008/09/28 21:50

> " 1234"なら"12344"になるはずだった



"1234" ではなくて、"12344" という結果を望んでいるのですか?
だとすると、

> char str[] = " 1 23 4 5";

この場合はどういう結果を望んでいるのですか?

ところで、コードを載せるときは、ここを見ている人たちが
「そのまま」コピー&ペーストしてコンパイルできるよう、
ヘッダーファイルのインクルードや関数定義など、
「全文を」載せてくださいませんか?

この回答への補足

失礼いたしました。
詰める過程で"123455555"とまず表示させたかったのです。
最終的には"12345"を望みます。
この処理は後々関数化して、void TrimSpace(char str[])で渡すとスペースを除いた文字列になるようにしたい思っています。

以下が現状のソースになります。
よろしくお願いします。

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

int main(void)
{
int i = 0;
char str[] = " 1 23 4 5";
char *p;

p = str;

while( *p != '\0' ){
if ( isspace(*p) != 0 ){
while( *(p + i + 1) != '\0' ){
*(p + i) = *(p + i + 1);
i++;
}
}
p++;
}

printf("%s\n",str);

return 0;
}

補足日時:2008/09/28 20:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A