Почему fscanf игнорирует первую строку в текстовом файле? [закрыто]

http://someurl.com?key=value&keynovalue&keyemptyvalue=&&keynovalue=nowhasvalue#somehash
  • Параллельная пара ключ / значение (?param=value)
  • Клавиши без значения (?param: знак равенства или значение)
  • Клавиши w / пустое значение (?param=: знак равенства, но нет значения справа от знака равенства)
  • Повторные клавиши (?param=1&param=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"]
    
2
задан Sierra 13 July 2018 в 18:45
поделиться

1 ответ

Я думаю, что вы, вероятно, получаете пустую строку в 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.

3
ответ дан Jonathan Leffler 17 August 2018 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: