Home > Software engineering >  C - Ways to count array length
C - Ways to count array length

Time:07-04

Hello I know these kind of questions are all over but I can't find the one I need. So I need a length of an array. One way works perfectly, one gives wrong answer and one doesn' compile.

This doesn't compile: size_t len = sizeof(array) / sizeof(array[0]);

This counts only first 4 letters: size_t len = sizeof(array) / sizeof(char);

And len = 12 works.

I really don't understand this so some hint is greatly appreciated.

const char array[] = {'t', 'h', 'i', 's', 'i', 's', 'm', 'y', 't', 'e', 'x', 't', 0};

void count_chars(const char *array, unsigned int *counts)
{
    size_t len = 12;
    
    for(size_t i = 0; i < len; i  ){
        counts[(int)array[i]]  ;
}

CodePudding user response:

You cant determine the size of the passed array inside function. You need to pass size as an additional parameter.

const char array[] = {'t', 'h', 'i', 's', 'i', 's', 'm', 'y', 't', 'e', 'x', 't', 0};

void count_chars(const char *arr, unsigned int *counts, size_t size)
{
    for(size_t i = 0; i < size; i  )
        counts[(unsigned)arr[i]]  ;
}

int main(void)
{
    int cnt[sizeof(array[0]) * (1 << CHAR_BIT)];

    count_chars(array, cnt, sizeof(array) / sizeof(array[0]));
}

You need to cast to unsigned (not int) because char values can be negative.

CodePudding user response:

What you are trying to do is actually impossible in C. The general rule of thumb is to calculate the length of the array in the function where the array is declared and pass it to the function. This is due to the fact that C doesn't pass the entire array when calling a function but rather just the base address as a pointer variable. To breakdown your approaches and the reason they do/don't work are:

size_t len = sizeof(array) / sizeof(array[0]);

This the commonly accepted approach but the prerequisite is that array must be declared in the same scope not be a pointer.

size_t len = sizeof(array) / sizeof(char);

As array is pointer a type variable and therefore has the size 4(atleast on 32-bit machines) dividing by sizeof(char) is 1 resulting in the answer 4

size_t len = 12;

This works as it's hard coded.

An easy solution in your case could be use:

size_t len = strlen(array)

as mentioned assuming you can guarantee that the last element will be 0 or '\0'. In this situation you could also simply modify the looping condition to:

for(int i = 0; array[i] != 0; i  ) {
    ...
}

Hope I could clarify your doubt

CodePudding user response:

size_t len = sizeof(array) / sizeof(array[0]);

This is general approach for getting the length of an array. However, this will not work inside count_chars function because array is defined as local variable (a pointer) inside the API. And if it is the case, the result will be 13 (not 12 as you mentioned) because it count also the \0 at the end.

For string of characters, it is possible to use strlen. As in the question, you expected result = 12 so this might be your right solution. However, this will not work if there is some \0 value in the middle because it will find first string terminator (\0).

CodePudding user response:

In C if you want to get length of Null Terminated Strings you have to check for NULL \0 and count characters.

Check here how strlen method works.

//Custom Strlen function.
size_t my_strlen(const char *str)
{
    register const char *s;

    for (s = str; *s;   s);
    return(s - str);
}

Strlen Source

To count length of Arrays (General) like Int,Float,Double you can use below method.

size_t int_arr_len = sizeof(int_arr) / sizeof(int_arr[0]);
size_t float_arr_len = sizeof(float_arr) / sizeof(float_arr[0]);

Full Source Code below

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char char_arr[] = {'t', 'h', 'i', 's', 'i', 's', 'm', 'y', 't', 'e', 'x', 't', 0}; // `\0` Null Terminated.
const int int_arr[] = {10, 20, 30, 40, 50};
const float float_arr[] = {1.5f, 2.5f, 3.5f, 4.5f, 5.5f};

//Custom Strlen function.
size_t my_strlen(const char *str)
{
    register const char *s;

    for (s = str; *s;   s);
    return(s - str);
}

int main()
{

    //Array length for Strings(Char array. Null Terminated. `\0`)
    size_t char_arr_len1 = strlen(char_arr);
    size_t char_arr_len2 = my_strlen(char_arr);

    //Array length for General arrays like Int,Float,Double...etc
    size_t int_arr_len = sizeof(int_arr) / sizeof(int_arr[0]);
    size_t float_arr_len = sizeof(float_arr) / sizeof(float_arr[0]);

    //Print length of arrays.
    printf("char_arr_len1: %zu\n", char_arr_len1);
    printf("char_arr_len2: %zu\n", char_arr_len2);
    printf("int_arr_len: %zu\n", int_arr_len);
    printf("float_arr_len: %zu\n", float_arr_len);

    return 0;
}

CodePudding user response:

You can use strlen(array) to get the length.

  • Related