http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash
?param=value
) ?param
: знак равенства или значение) ?param=
: знак равенства, но нет значения справа от знака равенства) ?param=1¶m=2
) ?&&
: нет ключа или значения) var queryString = window.location.search || '';
var keyValPairs = [];
var params = {};
queryString = queryString.substr(1);
if (queryString.length)
{
keyValPairs = queryString.split('&');
for (pairNum in keyValPairs)
{
var key = keyValPairs[pairNum].split('=')[0];
if (!key.length) continue;
if (typeof params[key] === 'undefined')
params[key] = [];
params[key].push(keyValPairs[pairNum].split('=')[1]);
}
}
params['key']; // returns an array of values (1..n)
key ["value"]
keyemptyvalue [""]
keynovalue [undefined, "nowhasvalue"]
Я думаю, что вы, вероятно, получаете пустую строку в 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
.