同様の質問をしましたが、重要な詳細を省略しました。文字の配列(cstring)でテキスト処理を行っています。入力配列は出力配列にコピーされますが、特定の文字が変更されます (a->b など)。これは、switch ステートメントを使用して行います。私が望むのは、特定の文字が2つ以上連続して見つかった場合、そのうちの1つだけが新しい配列にコピーされることです(したがって、2つのスペースを連続して使用したくありません)。
これは私がこれまでに得たものであり、特定の文字の行で2つ以上をスキップすることなく機能します:
char cleanName[ent->d_namlen];
for(int i = 0; i < ent->d_namlen; i++)
{
switch(ent->d_name[i])
{
case 'a' :
cleanName[i] = 'b';//replace a's with b's (just an example)
break;
case ' ' ://fall through
case '-' :
case '–' :
case '—' :
cleanName[i] = '_';//replace spaces and dashes with spaces
break;
....//more case statments
default:
cleanName[i] = ent->d_name[i];
}
}
たとえば、連続する 2 つの文字がアンダースコアに置き換えられた場合、どうすればよいでしょうか? switch
ステートメントを実行するだけですかif(ent->d_name[i] != previous || (ent->d_name[i] != '-' && ent->d_name[i] != '_' && ent->d_name[i] != ' ')
これは、実装固有の問題というよりもアルゴリズムの問題かもしれません。
入力例: abbc--de
出力: bbbc_d_e (簡単にするために、'a' が 'b' にマップされていると仮定しますが、実際にはこれ以上のものがあります)