C: strtok возвращает все значения в printf и только половину значений в массив - PullRequest
1 голос
/ 03 февраля 2012

Это должно маркировать поля с пробелами в строке str:

float values[2*linesnum(str, length)];
char * pch;
pch = strtok(str, " ");
while (pch != NULL) {
    printf("%s\n", pch);
    pch = strtok(NULL, " ");
}

linesnum () просто считает количество символов '\ n' в строке. Приведенный выше код правильно печатает все значения из str, которые я ожидаю.

Однако при этом печатается только первое значение, а затем каждое второе значение:

int k = 0;
float values[2*linesnum(data, length)];
char * pch;
pch = strtok(data, " ");
while (pch != NULL) {
    values[k] = atof(pch);
    //printf("%s\n", pch);
    printf("%f\n", values[k]);
    pch = strtok(NULL, " ");
    k++;
}

Вот пример того, как выглядит входная строка:

3.31 2.16
4.28 0.56
7.20 3.09
11.18 5.06

В первом коде он выведет:

3.31
2.16
4.28
0.56
7.20
3.09
11.18
5.06

Во втором коде он выведет:

3.310000
2.160000
0.560000
3.090000
5.060000

Я, должно быть, делаю что-то глупое. Это помещает только половину значений в массив? Почему, если все значения отображаются, когда я напрямую печатаю строку pch? Это как если бы одна команда pch = strtok(NULL, " "); выдает два вывода, а я могу захватить только один.

1 Ответ

3 голосов
/ 03 февраля 2012

Проблема заключается в том, что ваша строка выглядит примерно так: "1.234 5.678\n9.012 3.456", то есть второе и третье числа (а также четвертое и пятое числа и т. Д.) Разделены символом '\n', вместо этого ' ' символа. Чтобы исправить это, вы можете просто добавить '\n' к вашей строке символов-разделителей:

pch = strtok(NULL, " \n");

Просто примечание: причина, по которой ваш оригинальный код работает, заключается в том, что второе прочитанное значение на самом деле (в моем примере) "5.678\n9.012", которое при печати выглядит как

5.678
9.012

Несмотря на то, что это выглядит как два значения, в действительности это только одна строка.

...