Я не уверен, что Вы считаете "безболезненными".
струны до являются довольно болезненными. Мы можем найти первое положение непробельного символа тривиально:
while (isspace(* p)) p++;
Мы можем найти последнее положение непробельного символа с двумя подобными тривиальными перемещениями:
while (* q) q++; do { q--; } while (isspace(* q));
(я сэкономил Вас боль использования *
и ++
операторы одновременно.)
вопрос теперь - то, что Вы делаете с этим? Тип данных под рукой не является действительно большим устойчивым кратким обзором String
, который легок думать о, но вместо этого действительно едва больше, чем массив байтов устройства хранения данных. Испытывая недостаток в устойчивом типе данных, невозможно записать функцию, которая сделает то же как PHperytonby's chomp
функция. Что было бы такая функция в возврате C?
Группируя узлы Step в кластерный подграф, результат будет следующим:
digraph {
subgraph cluster_0 {
color=invis;
"Step1" -> "Step2" -> "Step3";
}
subgraph cluster_1 {
color=invis;
"Step2" -> "note4";
"Step2" -> "note3";
"Step2" -> "note2";
"Step2" -> "note1";
}
}
color = invis
удаляет границу, которая в противном случае была бы нарисована вокруг кластера
Используйте команду: Randhir = LR;
digraph {
rankdir=LR;
"Step1" -> "Step2" -> "Step3";
subgraph step2detail {
"Step2" -> "note1";
"Step2" -> "note2";
"Step2" -> "note3";
"Step2" -> "note4";
rankdir=TB
}
}
Хитрость для получения описанного вами графа состоит в том, чтобы использовать два подграфа и связать один с другим. Невидимые края в «деталях» — это то, что удерживает ноты на одном уровне.
digraph {
rankdir="LR";
subgraph steps {
rank="same";
"Step1" -> "Step2" -> "Step3";
}
subgraph details {
rank="same";
edge[style="invisible",dir="none"];
"note1" -> "note2" -> "note3" -> "note4";
}
"Step2" -> "note1";
"Step2" -> "note2";
"Step2" -> "note3";
"Step2" -> "note4";
}
Результат: