你要么搞砸了你的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到的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 };
然后,您可以通过令牌化每一串与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
看一下,然后告诉我知道,如果你有任何问题。
看到警告。修复如[this](http://ideone.com/f320eY) – BLUEPIXY