你要麼搞砸了你的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