Я пишу функцию, которая должна анализировать строку, содержащую описание броска костей, например "2 * 1d8 + 2". Я извлекаю четыре значения ОК, когда они являются целыми числами, но я хочу иметь возможность использовать и числа с плавающей точкой для множителя и сложения в конце. Все становится неприятно, когда я пытаюсь разобрать такую строку: «1.8 * 1d8 + 2.5».
Я определил, что проблема с функцией strcspn
. Я прошу его проанализировать входную строку s
(которая содержит строку игральных костей) и остановиться на звёздочке или 'x':
const char * s = "1.8*1d8+2.5";
size_t l = strcspn(s,"*x");
Функция должна вернуть 3
, так как звездочка находится на 4-й позиции. Однако кажется, что он останавливается на десятичном разделителе (период) и возвращает 1
.
Дело не в том, что я не могу продолжать писать свою функцию без этого, поскольку есть другие способы добиться цели, но все же мне любопытно, почему это могло бы произойти. Кто-нибудь когда-нибудь сталкивался с этой проблемой раньше?
[EDIT]
Неважно, я нашел ответ, и это была моя глупость, а не компилятор, играющий со мной шутки. Я использовал этот код:
if (l = strcspn(s,"*x") < strlen(s)) {
...
, который возвратил 1
(или true
), потому что strcspn(s,"*x") < strlen(s)
оценивается как true
- и был присвоен переменной l
. Я должен был добавить скобки:
if ((l = strcspn(s,"*x")) < strlen(s)) {
...
Тем не менее, спасибо за ваши ответы, особенно @sleske, который заставил меня более глубоко анализировать мой код (что привело к поиску ответа).