Изменение того, которое я использовал в течение достаточно долгого времени:
CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS
BEGIN
SET @string = LOWER(@string)
DECLARE @i INT
SET @i = ASCII('a')
WHILE @i <= ASCII('z')
BEGIN
SET @string = REPLACE( @string, ' ' + CHAR(@i), ' ' + CHAR(@i-32))
SET @i = @i + 1
END
SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1)
RETURN @string
END
можно легко изменить для обработки символов после объектов кроме пробелов, если Вы хотели.
В PHP есть много предопределенных констант , которые часто бывают полезными.
Здесь PHP_OS
- это то, что вы ищете.
Для Например, на моем текущем компьютере этот код:
var_dump(PHP_OS);
дает:
string 'Linux' (length=5)
У вас есть несколько примеров и сравнений с тем, что функция php_uname
может предоставить вам на странице руководства в php_uname
; например (цитата) :
<?php
echo php_uname();
echo PHP_OS;
/* Some possible outputs:
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux
FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD
Windows NT XN1 5.1 build 2600
WINNT
*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'This is a server using Windows!';
} else {
echo 'This is a server not using Windows!';
}
На этой странице также написано:
Для названия только действующего системы, рассмотрите возможность использования
PHP_OS
постоянно, но имейте в виду это константа будет содержать операционную Следующая строкаcurrent-> next = result;
делает следующее:// NULL<-a b ... (notice there is no longer a pointer from a to b)
Тогда у нас есть
result = current;
который устанавливаетresult
вa
(опять же, достаточно просто). И, наконец, у нас есть все важныеcurrent = next;
, которые устанавливаютcurrent
вb
.Итак, на следующей итерации цикла while, с
следующий
установлен наb
,результат
установлен наa
, атекущий
установлен наb
, мы начинаем сначала:next = current->next; // NULL<-a<-b c ... current->next = result; result = current;
Затем делаем это снова:
next = current->next; // NULL<-a<-b<-c d ... current->next = result; result = current;
Когда мы добрались до последнего элемента в связанном списке (
e
в этом примере), происходит следующее:next = current->next; // next becomes NULL // NULL<-a<-b<-c<-d<-e current->next = result; result = current; // result is now e current = next; // current is now NULL
Теперь , поскольку
current
имеет значение NULL, цикл while завершается, и у нас остается:*headRef = result;
который,
Посетите этот сайт для визуального представления.
Похоже, хорошее объяснение проекта здесь тоже (см. Метод 3).
список выглядел так:
=>(1) => => => => => => => => =>(10)
мы перевернули каждую часть списка
<=(1) => => => => => => => => =>(10)
<=(1) <= => => => => => => => =>(10)
<=(1) <= <= => => => => => => =>(10)
...
<=(1) <= <= <= <= <= <= <= <= <=(10)
, так что теперь начало находится в конце, и мы можем посмотреть на список с другой точки и увидеть:
=>(10) => => => => => => => => =>(1)
Я нарисовал точечную диаграмму, которая, как мне кажется, графически объяснит, что происходит:
Ссылка на полноразмерное изображение
А вот (небрежно) источник точек на случай, если кому-то интересно:
digraph g {
label = "Start"
subgraph cluster_1
{
a1 -> b1 -> c1;
current1 -> a1;
result1
a1 [label="a"]
b1 [label="b"]
c1 [label="c"]
current1 [label="current"]
result1 [label="result"]
}
label = "Once through loop"
subgraph cluster_2
{
current2 -> b2;
result2 -> a2;
b2 -> c2;
a2 [label="a"]
b2 [label="b"]
c2 [label="c"]
current2 [label="current"]
result2 [label="result"]
}
label = "Twice through loop"
subgraph cluster_3
{
current3 -> c3;
result3 -> b3;
b3 -> a3;
a3 [label="a"]
b3 [label="b"]
c3 [label="c"]
current3 [label="current"]
result3 [label="result"]
}
label = "Final"
subgraph cluster_4
{
result4 -> c4 -> b4 -> a4;
a4 [label="a"]
b4 [label="b"]
c4 [label="c"]
current4 [label="current"]
result4 [label="result"]
}
label = ""
}