我正在编写一个应该将字符串拆分为" - "并返回包含字符串中部分的数组,如果该字符串为: 2017年10月23日 我希望数组有三个元素填充如下: arr [0] = 2017,arr [1] = 10,arr [2] = 23
这是功能:
/*
* return a array of the parts of date_string
*/
int * to_date_array(char *date_string)
{
int i = 0;
int f = 0;
char *tokens = strtok(date_string, "-"); /* get initial token */
static int arr[3] = {0, 0, 0};
char *ptr;
int val;
/* init static arr */
for (f = 0; f < sizeof(arr); f++)
arr[f] = 0;
/* do the split */
while (tokens != NULL) {
val = strtol(tokens, &ptr, 10);
arr[i++] = val;
tokens = strtok(NULL, "-");
}
/*
* for some reason arr becomes 12 elements long?
* I expected it to have 3 elements
*/
puts("func: to_date_array");
puts("------------------------");
for (f = 0; f < sizeof(arr); f++)
printf("arr[%d]: %d\n", f, arr[f]);
return arr;
}
这个功能有效,但我对#34; arr&#34;真的感到困惑。阵列。我希望它是三个元素长,但当我遍历它并打印每个元素时,它显示12个元素?
$ gcc -Wall main.c arguments.c -o timespan
$ ./timespan 2015-08-10 2017-10-18
func: to_date_array
------------------------
arr[0]: 2015
arr[1]: 8
arr[2]: 10
arr[3]: 0
arr[4]: 0
arr[5]: 0
arr[6]: 0
arr[7]: 0
arr[8]: 0
arr[9]: 0
arr[10]: 0
arr[11]: 0
答案 0 :(得分:1)
sizeof
操作数返回 bytes 的大小(根据定义,char
占用一个字节)。在你的(和我的)机器上,sizeof(int)
是4,因此3 int
的数组需要12个字节。请参阅nucleon's answer。
您的to_date_array
不可重入。返回动态分配的数组会更好(例如,使用calloc
....)。当然,您需要采用约定,其结果必须晚于free
- d(例如,由调用者)。
您还可以考虑返回指向以flexible array member结尾的某些struct
的指针。
您也可以将arr
(及其长度)传递给to_date_array
,然后由该函数填充。
答案 1 :(得分:1)
sizeof
以字节为单位计算数组的大小,因此你必须除以单个元素的大小来得到元素的数量,因此使用
sizeof(arr)/sizeof(*arr)
答案 2 :(得分:1)
sizeof
返回数组中 bytes 的数量,而不是元素的数量。在您的系统上,int
宽度为4个字节,因此该数组占用12个字节。
您需要将数组的大小除以单个元素的大小以获取元素的数量:
sizeof arr / sizeof *arr
C不对数组访问进行任何边界检查 - 数组只有三个元素宽,但如果您尝试访问该范围之外的元素,则不会获得任何类型的OutOfBounds异常。行为未定义 - 您的代码可能会崩溃,可能会产生意外结果,它可能会按预期工作,但结果不一定是可重复的或可预测的。
答案 3 :(得分:0)
sizeof int arr[3]
是sizeof(int) * 3
等于4 * 3 = 12