助けてください

[戻る]
TOM [E-Mail] 2003/02/03(月) 16:17:02
皆さん初めまして。
C++を始めたばっかの初心者です。あるくだらない事で今悩んでいます。簡単なようなん
ですけど僕にとってはとっても難しい事なんで、怒んないで下さい。
例えばですよ、ユーザーに何かインプットさせます。まぁ、こんな感じで
what the hell is wrong with you boy? みたいな感じで。英語ですんません。
それをこんな風に変えられることはできますか?
wht te hel is wrg wth yu by?
最初の文字と最後の文字、ほんで単語が長ければ適当に最初の文字と最後の文字以外の
文字を選ぶ。なんかくだらない事ですがこれをどうしてもマスターしたいんです。教え
てください。C++むずすぎます・・・。

επιστημη 2003/02/03(月) 16:48:07
> ...ほんで単語が長ければ適当に最初の文字と最後の文字以外の文字を選ぶ。

- 長い単語であるか否かの判別方法
- 適当な文字の選び方

を示してください。

> なんかくだらない事ですがこれをどうしてもマスターしたいんです。

マスターしたいのは何ですか? 文字列から任意の文字を引っこ抜く方法ですか?

> C++むずすぎます・・・。

ではあなたは BASICなら/Javaなら/Cなら 書けますか?
書けるならそれを見せてください。

NTAKA 2003/02/03(月) 17:34:05
はじめまして、初めて書き込ませていただくNTAKAというものです。

うーん・・・確かにTOMさんの話だけでは、よくわかりませんね。
「適当に」ではなく具体的にどうしたいかを明確にする必要があると思います。

ただ、strtok という関数があったと思います。これを使えば、
TOMさんがやりたいことがたぶん、楽にできると思います。

私の見当違いだったらあんまり参考にならないかもしれませんが・・・
ではでは。

επιστημη 2003/02/03(月) 17:38:05
> ただ、strtok という関数があったと思います。これを使えば、
> TOMさんがやりたいことがたぶん、楽にできると思います。

入力文字列を単語毎に区切るところまではstrtokでやれるでしょう。

sugar 2003/02/03(月) 17:41:25
この程度の内容は、C++でなくとも、Cの範疇で解決できると思います。
(C++で作らなければならないという条件があるなら別ですが)

私ならまずstrtok()を使い、
"what the hell is wrong with you boy?"を" "で分割します。
次に、各単語を吟味します。
吟味とは、一文字ずつ、残すのか、除去するのか、を判別することです。
この判別は、επιστημηさんが示すよう言っている2点を
TOMさんが明確にしないといけませんね。
本件の仕様になるわけで、TOMさん以外、わかりえないことです。

まゆみ 2003/02/03(月) 19:19:35
なんか学生さんの課題っぽいですけど
こんな感じでしょうか
皆さんご指摘されてるように

- 長い単語であるか否かの判別方法
- 適当な文字の選び方
- 単語が2文字だったときの処理

等はご自分で考えてください。

#include <string.h>

char *hoge(const char *word, char *buf);

void main(void)
{
  char  str[] = "what the hell is wrong with you boy?";
  char  *p = str;
  char  buf[256];
  char  result[256];

  result[0] = '\0';
  p = strtok(str, " ");
  do {
    strcat(strcat(result, hoge(p, buf), " ");
  } while ((p = strtok(NULL, " ")) != NULL);

  result[strlen(result) - 1] = '\0';
}

char *hoge(const char *word, char *buf)
{
  const int    max_word_len = 5;

  if (strlen(word) > max_word_len) {
        ;
  } else {
    strcpy(buf, word + 1);
    buf[strlen(buf) - 1] = '\0';
  }

  return buf;
}

まゆみ 2003/02/03(月) 20:41:14
あはっ。
まちがえちゃった。

>  } else {
>    strcpy(buf, word + 1);
>    buf[strlen(buf) - 1] = '\0';
>  }

  } else {
    buf[0] = word[0];
    buf[1] = word[strlen(word) - 1];
    buf[2] = '\0';
  }

かな・・・

TOM [E-Mail] 2003/02/04(火) 00:13:59
皆さんご親切に説明してくれてありがとうございます。strtokについてもうちょい詳し
く調べて見ます。
まゆみさん、親切にCodeまで書いてくれてありがとうございます。参考にします。

επιστημη 2003/02/04(火) 06:59:12
...説明しなきゃあかんのは僕らではなくあなたです。
僕の2つの疑問に答えていただけないのかしら?

# すっごく中途半端でフラストレーション溜まりまくり。

επιστημη 2003/02/04(火) 09:52:33
ガス抜きがてら、C++で書いたです。
 '長さが3文字を越えていたら、真中の文字を抜く'を繰り返しています。

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>

using namespace std;

struct truncate {
  string operator()(const string& x) const {
    string result = x;
    while ( result.size() > 3 ) {
      result.erase(result.size()/2,1);
    }
    return result;
  }
};

int main() {
  transform(istream_iterator<string>(
              istringstream("what the hell is wrong with you boy?")),
            istream_iterator<string>(),
            ostream_iterator<string>(cout, " "),
            truncate());
  return 0;
}

PAI 2003/02/04(火) 13:47:45
basic_string にeraseなんてあったんですね。はじめて知りました。

// ・・・利用方法が思いつかない。replaceでいいか。

古いスレッドには追加発言できません。