[英]Dynamically find array length in C program without using sizeof
我正在嘗試讀取文件,並且僅將數字存儲在數組中。
我的示例是file.csv
"1","2","3" "1","4","6","7" "12","15"
請不要建議這些解決方案
sizeof(arr) / sizeof(arr[0])
或*(&arr + 1) - arr
因為這兩個都不給出包含實際值的數組的長度。 它只是在聲明數組時給出數組的長度。 我想知道存在實際值時在運行時數組的長度。
問題陳述:在每一行中找到numOfwords(在代碼注釋中顯示)。
我的代碼如下:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i = 0, j = 0, k = 0;
char literal, string[4][10][4];
char *filename = "file.csv";
FILE *f;
f = fopen(filename, "r");
while ((literal = getc(f)) != EOF) {
if (isdigit(literal)) {
string[i][j][k] = literal;
k++;
} else {
if (k > 0) {
string[i][j][k] = '\0';
}
k = 0;
}
if (literal == ',') j++;
if (literal == '\n') i++, j = 0;
}
int numOfLines = i;
int total = 0;
for (int p = 0; p < numOfLines; p++) {
// int numOfWords = *(&string[p] + 1) - string[p]; // Returns 10
// int numOfWords = sizeof(string[p]) / sizeof(string[p][0]); // Returns 10
//
// The Problem Statement: Find the numOfwords in each line.
printf("numOfWords in line %p: %d\n", numOfWords);
for (long int q = 0; q < numOfWords; q++) {
/* code */
total += atoi(string[p][q]);
}
}
printf("Sum = %d", total);
}
任何比此代碼更好的解決方案都值得贊賞。
輸出:
numOfWords in line 1: 3 numOfWords in line 2: 4 numOfWords in line 3: 2 Sum = 51
您必須自己跟蹤放置在數組中的元素數量。 沒有別的辦法了。
也許:
typedef struct
{
size_t size;
size_t elementsize;
unsigned char array[];
}myarray;
myarray *MA_Init(void)
{
myarray *arr = calloc(1, sizeof(*arr));
return arr;
}
myarray *MA_alloc(myarray *arr, size_t nelem, size_t elemsize)
{
narr = realloc(arr, nelem * elemsize + sizeof(*narr));
if(narray)
{
narray -> size = nelem;
narray -> elementsize = elemsize;
}
return narr;
}
int MA_Set(myarray *arr, size_t index, void *elem)
{
int result = !arr;
result = result && (index < arr -> size);
if(result)
{
memcpy(&arr -> array[index * arr -> elementsize], elem, arr -> elementsize);
}
return result;
}
int MA_Get(myarray *arr, size_t index, void *elem)
{
int result = !arr;
result = result && (index < arr -> size);
if(result)
{
memcpy(elem, &arr -> array[index * arr -> elementsize], arr -> elementsize);
}
return result;
}
... 等等....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.