Я думаю, что вы, вероятно, получаете пустую строку в firstString
, потому что secondString
недостаточно длинна, чтобы содержать 2 символа и нулевой байт, и так получилось, что на вашем машина с вашим компилятором, secondString
хранится непосредственно перед firstString
в памяти. Когда fscanf()
копирует AB
и нулевой байт в secondString
, нулевой байт запишет первый байт из firstString
, чтобы он выглядел (является) пустым.
Вы могли бы подтвердите это, напечатав &firstString[1]
с помощью "[%s]"
и увидев, что он содержит большую часть того, что вы ожидали.
Этот макет не гарантируется стандартом; это просто правдоподобное предположение, объясняющее то, что вы видите. Вам нужно либо использовать %2c
вместо %2s
, чтобы получить AB
в secondString
(но тогда имя «строка» является неправильным, это не строка с нулевым завершением). Или вам нужно увеличить размер secondString
до не менее 3 байтов - допустим, что терминал null. У вас есть аналогичная проблема с размером с firstString
. Разница между размером массива в коде (N байтов, скажем) и размером строки в форматах scanf()
(N-1 байт) является «неудобной», но освящена многолетними традициями (это было, таким образом, в 7-м выпуске Unix около 1978 года). Теперь изменить его было бы хуже, чем оставить в покое.
Вам также нужно исправить вызов fscanf()
, чтобы вы передали &number
вместо number
.
Мое предложение:
<?php
$html_classes = 'class1 class2 class3 ';
$result = '.' . preg_replace('/\s+/', '.', trim($html_classes));
echo $result;
?>
Регулярные выражения:
\ s символ пробела.
+ означает одно или несколько вхождений.
PHP (из http://php.net ):
blockquote>
preg_replace - выполняет поиск и замену регулярного выражения. ( http://php.net/manual/pl/function.preg-replace.php )
обрезать - убирать пробелы (или другие символы) из начало и конец строки. ( http://php.net/manual/pl/function.trim.php )
Вы можете сделать это без дополнительной обрезки или объединения. Найдите непробельные символы, заключенные в ноль или более пробелов, и замените эти совпадения непропускной частью совпадения, которому предшествует точка.
$html_classes = preg_replace('/\s*(\S+)\s*/', '.$1', $html_classes);
Ответ так же прост, как один вызов на замену на основе регулярных выражений:
<?php
$input = 'class1 class2 class3 ';
$output = preg_replace('/\s*([\w\d]+)\s*/', '.${1}', $input);
print_r($output);
Выход, очевидно,:
Просто сначала замените все лишние пробелы на синглы. И выполните trim (), чтобы убрать пробелы в начале и в конце.
$html_classes = 'class1 class2 class3 ';
$html_classes = trim(preg_replace('/\s+/',' ',$html_classes));
$result = '.' . str_replace(' ','.',$html_classes);
Попробуйте это:
<?php
$html_classes = 'class1 class2 class3 ';
$parts = explode(" ", $html_classes);
$results = "";
foreach($parts as $c){
if($c != ""){
$results .= "." . $c;
}
}
echo $results;
?>
Результаты, которые я получил:
.class1.class2.class3
Надеюсь, что помогает.