1

charsいくつかの操作を行うために、配列を反復処理しています。同じ文字が 2 つ隣接している場合、反復を「スキップ」したいと考えています。

例: x112abbca
スキップ----------^

私はいくつかのコードを持っていますが、それはエレガントではなく、誰かがより良い方法を考えられるかどうか疑問に思っていましたか? ステートメントにはいくつかcaseのがありますが、.内でステートメントswitchを使用する必要がなければ幸いです。ifswitch

switch(ent->d_name[i])
{
            if(i > 0 && ent->d_name[i] == ent->d_name[i-1])
                continue;
            case ' ' :
            ...//code omited
            case '-' :
            ...
}

ところで、あるインストラクターは、continue「それらを置き換えるために多くのコードが必要でない限り、 s を避ける」と私に言いました。誰かがそれを二番目にしますか?(実際、彼はbreaksについても同じことを言っていました)

4

4 に答える 4

3

ifの外側に置きswitchます。

continue私はandの使用に何の反対もありませんがbreak、今回は多くのコードをまったく使用せずに確実にバイパスできます。条件を元に戻し、switch ステートメント全体を if ブロック内に配置するだけです。

修正された質問への回答: 何がクリーンかは、多くの要因に依存します。この文字リストの長さを考慮する必要があります。それらを自分で反復処理する必要があります<algorithm>か、それとも . いずれにせよ、同じ文字を複数回参照している場合は、おそらくエイリアスを指定する必要があります。

std::string interesting_chars("-_;,.abc");

// ...
for (i...) {
  char cur = abc->def[i];
  if (cur != prev || interesting_chars.find(cur) == std::string::npos)
      switch (current) // ...
于 2012-08-28T19:38:53.863 に答える
0
char chr = '\0';
char *cur = &ent->d_name[0];
while (*cur != '\0') {
    if (chr != *cur) {
        switch(...) {
        }
    }
    chr = *cur++;
}
于 2012-08-28T19:59:54.433 に答える
0

あなたが何をしようとしているのか理解できれば幸いです。とにかく、これは一致するペアを見つけて、一致をスキップします。

char c_anotherValue[] = "Hello World!";

int i_len = strlen(c_anotherValue);
for(int i = 0; i < i_len-1;i++)
{
    if(c_anotherValue[i] == c_anotherValue[i+1])
    {
        printf("%c%c",c_anotherValue[i],c_anotherValue[i+1]);
        i++;//this will force the loop to skip
    }
}
于 2012-08-28T23:58:25.163 に答える
0

分析している配列のコンテンツを上書きできる場合は、次のように前処理できますstd::unique()

ent->erase(std::unique(ent->d_name.begin(), ent->d_name.end()), ent.end());

これにより、同一文字のすべてのシーケンスが単一のコピーに置き換えられ、文字列が適切に短縮されます。文字列自体を上書きできない場合は、1 つの文字列だけの文字シーケンスでコピーを作成できます。

std::string tmp;
std::unique_copy(ent->d_name.begin(), ent->d_name.end(), std::back_inserter(tmp));

C 文字列を使用している場合:std::string代わりに使用します。C文字列の使用を主張し、初期化された文字std::unique()を使用するよりも優れたアプローチで遊びたくない場合(結局のところ、これはC文字列の一部にすることはできません):previous0

char previous(0);
for (size_t i(0); ent->d_name[i]; ++i) {
    if (ent->d_name[i] != previous) {
        switch (previous = ent->d_name[i]) {
             ...
        }
     }
}
于 2012-08-28T20:03:25.750 に答える