strcspn () останавливается через период - PullRequest
1 голос
/ 25 октября 2010

Я пишу функцию, которая должна анализировать строку, содержащую описание броска костей, например "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, который заставил меня более глубоко анализировать мой код (что привело к поиску ответа).

Ответы [ 4 ]

1 голос
/ 25 октября 2010

Ваш код работает так же, как вы отправили его мне 1 .

#include <stdio.h>
#include <string.h>

int main(void) {
  const char * s = "1.8*1d8+2.5";
  size_t l = strcspn(s,"*x");
  printf("%zd (%.*s)\n", l, (int)l, s);
  return 0;
}
so ross$ ./a.out
3 (1.8)

1Mac OS X 10.6.4

1 голос
/ 25 октября 2010

Должна быть ошибка где-то еще. Я написал тестовую программу:

#include <stdio.h>
#include <string.h>
void main(){
  const char * s = "1.8*1d8+2.5";
  size_t l = strcspn(s,"*x");
  printf("l: %d\n", l);
}

и скомпилировал его с gcc в Linux. В моей системе выводится «3».

Пожалуйста, опубликуйте полный рабочий пример, демонстрирующий проблему. Тогда посмотрим ...

0 голосов
/ 25 октября 2010

Этот код:

#include <stdio.h>
#include <string.h>

int main(void)
{
    const char * s = "1.8*1d8+2.5";
    size_t l = strcspn(s,"*x");
    printf("<<%s>> %zd <<%s>>\n", s, l, s+l);
    return 0;
}

выдает этот ответ на MacOS 10.6.4 (GCC 4.5.1):

<<1.8*1d8+2.5>> 3 <<*1d8+2.5>>

Если ваш компилятор и библиотека не выдают одинаковый ответполучите исправленную / обновленную версию программного обеспечения.

(Примечание: модификатор 'z' в строке формата printf() является функцией C99 - это указывает, что тип параметра size_t.)

0 голосов
/ 25 октября 2010

Я бы использовал sscanf вместо того, чтобы вручную находить точки остановки и анализировать себя. С этим вы можете получить целые числа и значения с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...