您要么搞砸了s 的声明(很可能给定了其余代码),要么搞砸了声明 s 并在 s 上调用 strtok 的方式(这是一个 array-of-pointers-to-char* 包含指向 字符串字面量 的指针,如所写。)
看来您实际上想要char s[] 作为您的声明。这将揭示初始化中存在几个缺失 和几个无关 ','s 的问题。要将 s 声明为 array-of-char 初始化并保存 comma-separated-values 列表,您基本上想要
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
如果您的意图是创建一个 array-of-pointers-to-char*(例如 char *s[]),那么您必须重新编写声明和代码的其余部分,因为 (1 ) 您没有将字符指针传递给strtok;和 (2) strtok 修改传递给 strtok 的字符串,同时传递一个完全错误的 字符串文字 - 并保证 SegFault。
如果您有任何问题,请告诉我。
作为指向字符的指针数组*
根据您的评论,如果您需要找到s 中每个单独字符串的mean 或average,那么s 必须是一个指向字符的指针数组*。正如评论中解释的那样,您不能初始化 char *s[] 以包含 { "stuff", "morestuff", ... },因为 "stuff" 和 "morestuff" 是 字符串文字,并且在大多数情况下将在 只读中创建em>内存。由于strtok 修改了原始字符串,您将尝试修改 只读 内存,10 次中有 9 次会导致友好的 分段错误(不好) .
但是,您可以简单地将单个字符串创建为 字符数组,然后从字符数组创建 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 };
然后,您可以通过使用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
查看一下,如果您有任何其他问题,请告诉我。