Вы либо испортили вашу декларацию s
(скорее всего, учитывая остаток от вас код), или ваш перепутались, как вы заявляете s
и вызвать strtok на s
(который является массив из-указателей к -char *, содержащие указатели на строковых литералов, как написано.)
Похоже, вы действительно хотите char s[]
как вашей декларации. Что бы выявить проблемы с несколькими отсутствующимии несколько посторонний','
s в процессе инициализации. Для того, чтобы объявить s
как массив из-полукокса инициализирован держит список разделенных запятыми значений, вы существенно хотите
char s[] = { "12, 34, 56, 78, ...., 9000.09, 90000.9" };
Там нет требования, что у вас есть только один набор цитат (".."
) в инициализации, но каждое значение, которое вы ищете для токенизации из строки, должно содержать запятую (за исключением последнего значения).Можно объявить и инициализировать s
следующим образом:
char s[] = { "12, 34, 56, 78," "82.16, 41.296,"
"2, -3, 5, -7, 11, -13, 17, -19,"
"9.00009, 90.0009, 900.009, 9000.09, 90000.9" };
Остальная часть кода работает отлично в этом случае, производя следующий вывод:
$ ./bin/strtok_arr
12
34
56
78
82.16
41.296
2
-3
5
-7
11
-13
17
-19
9.00009
90.0009
900.009
9000.09
90000.9
Если ваша цель в том, чтобы создать массив из -pointers-to-char * (например, char *s[]
), то вы должны переделать декларацию и остаток кода, потому что (1) вы не передаете указатель на символ strtok
; и (2) strtok
изменяет переданную строку, обращаясь к strtok
при прохождении строки литерала просто неправильно - и гарантировано SegFault.
Дайте мне знать, если возникнут какие-либо вопросы.
В качестве массива из-указателей-на-гольца *
От ваш комментарий, если вам нужно найти значит или среднее каждого из отдельных строк в s
, то s
должен быть массив-указателей на символ *. Как пояснил в комментарии, вы не можете инициализировать char *s[]
содержать { "stuff", "morestuff", ... }
"stuff"
потому и "morestuff"
являются строковые литералы и в большинстве случаев будут созданы в только для чтения памяти. Поскольку strtok
изменяет исходную строку, вы будете пытаться изменить только для чтения память, которая 9 раз из 10 приводит к дружеской ошибке сегментации (не хорошо).
Однако вы можете просто создать отдельные строки в качестве символьных массивов, а затем создать s
из массивов символов, например:
char s1[] = "12, 34, 56, 78",
s2[] = "82.16, 41.296",
s3[] = "2, -3, 5, -7, 11, -13, 17, -19",
s4[] = "9.00009, 90.0009, 900.009, 9000.09, 90000.9",
*s[] = { s1, s2, s3, s4 };
Вы можете закончить ваш код tokenizing каждой из строк с strtok
и преобразование каждого значения в double
при сборе sum
и average
каждого. например
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main (void)
{
char s1[] = "12, 34, 56, 78",
s2[] = "82.16, 41.296",
s3[] = "2, -3, 5, -7, 11, -13, 17, -19",
s4[] = "9.00009, 90.0009, 900.009, 9000.09, 90000.9",
*s[] = { s1, s2, s3, s4 };
size_t i, idx = 0, n = sizeof s/sizeof *s;
double avg[n];
for (i = 0; i < n; i++) {
double sum = 0.0;
size_t nval = 0;
char *token = strtok (s[i], ", ");
while (token != NULL) {
sum += strtod (token, NULL);
nval++;
printf (" %8s, sum : %9.2lf\n", token, sum);
token = strtok (NULL, ", ");
}
printf ("----------------------------\n");
printf (" average : %9.2lf\n\n", (avg[idx++] = sum/nval));
}
return 0;
}
я, вероятно, переписать цикл токенизации как for
петли, чтобы включить nval
приращение в определении контура самой, например,
for (; token; token = strtok (NULL, ", "), nval++) {
sum += strtod (token, NULL);
printf (" %8s, sum : %9.2lf\n", token, sum);
}
В любом случае, ваш sum
и average
каждой строки будет выглядеть следующим образом:
$ ./bin/strtok_arr1
12, sum : 12.00
34, sum : 46.00
56, sum : 102.00
78, sum : 180.00
----------------------------
average : 45.00
82.16, sum : 82.16
41.296, sum : 123.46
----------------------------
average : 61.73
2, sum : 2.00
-3, sum : -1.00
5, sum : 4.00
-7, sum : -3.00
11, sum : 8.00
-13, sum : -5.00
17, sum : 12.00
-19, sum : -7.00
----------------------------
average : -0.88
9.00009, sum : 9.00
90.0009, sum : 99.00
900.009, sum : 999.01
9000.09, sum : 9999.10
90000.9, sum : 100000.00
----------------------------
average : 20000.00
Посмотрите его и дайте мне знать, если у вас есть какие-либо дополнительные вопросы.
см предупреждение. исправить как [этот] (http://ideone.com/f320eY) – BLUEPIXY