簡體   English   中英

不使用sizeof在C程序中動態查找數組長度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM