Нахождение длины массива символов в C

Каким образом в C кто-то может найти длину массива символов?

Я с радостью приму псевдокод, но не прочь, чтобы кто-то написал его, если захочет :)


person not_l33t    schedule 15.11.2010    source источник
comment
Вы имеете в виду, кроме поиска NUL?   -  person Ignacio Vazquez-Abrams    schedule 15.11.2010
comment
Либо strlen(), либо sizeof(). Это зависит от того, что вам нужно.   -  person ruslik    schedule 15.11.2010
comment
строка — это объект определенного типа, хранящийся в массиве символов (массив символов может не содержать строку)   -  person    schedule 15.11.2010
comment
@pst: вопрос достаточно расплывчатый, чтобы мы могли интерпретировать его как угодно. Верна ли наша интерпретация, зависит от того, с чем решит вернуться спрашивающий.   -  person Ignacio Vazquez-Abrams    schedule 15.11.2010
comment
@pst, учитывая то, как ОП поставил вопрос, мы имеем право предполагать что угодно.   -  person ruslik    schedule 15.11.2010
comment
ха, мне нравится философский комментарий в конце   -  person not_l33t    schedule 15.11.2010
comment
@pst Я считаю, что задал неправильный вопрос из-за непонимания терминологии - все еще довольно новичок в этом. я где-то читал, что C на самом деле не использует строки, но это, вероятно, немой вопрос, учитывая, что я все еще задал глупый вопрос   -  person not_l33t    schedule 15.11.2010
comment
Возможный дубликат Поиск длины массива символов   -  person JaBe    schedule 20.06.2016


Ответы (9)


При условии, что массив символов null завершен,

char chararray[10] = { 0 };
size_t len = strlen(chararray);
person Daniel A. White    schedule 15.11.2010
comment
И sizeof(), и strlen() возвращают size_t, который отличается от int тем, что потенциально может быть больше или меньше и, конечно, беззнаковым. - person Chris Lutz; 15.11.2010
comment
Обратите внимание, что в приведенном примере strlen(chararray) возвращает 0, поскольку массив пуст. - person Generic Ratzlaugh; 12.08.2020

Если у вас есть массив, вы можете найти количество элементов в массиве, разделив размер массива в байтах на размер каждого элемента в байтах:

char x[10];
int elements_in_x = sizeof(x) / sizeof(x[0]);

Для конкретного случая char, поскольку sizeof(char) == 1, sizeof(x) даст тот же результат.

Если у вас есть только указатель на массив, то невозможно найти количество элементов в массиве, на который указывает указатель. Вы должны следить за этим сами. Например, учитывая:

char x[10];
char* pointer_to_x = x;

невозможно определить только по pointer_to_x, что он указывает на массив из 10 элементов. Вы сами должны следить за этой информацией.

Есть множество способов сделать это: вы можете либо сохранить количество элементов в переменной, либо вы можете закодировать содержимое массива так, чтобы вы могли каким-то образом получить его размер, проанализировав его содержимое (это фактически то, что делают строки с завершающим нулем). : они помещают символ '\0' в конец строки, чтобы вы знали, когда строка заканчивается).

person James McNellis    schedule 15.11.2010
comment
И sizeof(), и strlen() возвращают size_t, который отличается от int тем, что потенциально может быть больше или меньше и, конечно, беззнаковым. - person Chris Lutz; 15.11.2010
comment
Это должен быть принятый ответ. Он вернет размер инициализированного массива. - person LUser; 20.03.2020

Хотя предыдущие ответы в порядке, вот мой вклад.

//returns the size of a character array using a pointer to the first element of the character array
int size(char *ptr)
{
    //variable used to access the subsequent array elements.
    int offset = 0;
    //variable that counts the number of elements in your array
    int count = 0;

    //While loop that tests whether the end of the array has been reached
    while (*(ptr + offset) != '\0')
    {
        //increment the count variable
        ++count;
        //advance to the next element of the array
        ++offset;
    }
    //return the size of the array
    return count;
}

В вашей основной функции вы вызываете функцию размера, передавая адрес первого элемента вашего массива.

Например:

char myArray[] = {'h', 'e', 'l', 'l', 'o'};
printf("The size of my character array is: %d\n", size(&myArray[0]));
person SteveMoros    schedule 02.04.2011
comment
Зачем иметь отдельную переменную для смещения, если можно просто использовать count? Вот более короткая (но трудная для понимания) версия: int strlen(const char* pStr){ int i = 0; while (*pStr) { ++i; } return i; } - person DividedByZero; 25.05.2015
comment
char myArray[] = {'h', 'e', ​​'l', 'l', 'o'}; не заканчивается на '\0' автоматически. Вам нужно вручную назначить '\0' для myArray. мойМассив[6] = '\0'; по крайней мере, на моем MacOS. g++ 4.2.1, Apple LLVM версии 9.1.0 (clang-902.0.39.2) - person 1234; 25.11.2019
comment
если вы используете char myArray[] = hello; тогда ваш код работает. - person 1234; 25.11.2019

Вы можете использовать стрлен

strlen(urarray);

Вы можете закодировать его самостоятельно, чтобы понять, как это работает.

size_t my_strlen(const char *str)
{
  size_t i;

  for (i = 0; str[i]; i++);
  return i;
}

если вам нужен размер массива, вы используете sizeof

char urarray[255];
printf("%zu", sizeof(urarray));
person dco    schedule 15.11.2010
comment
Любой strlen() должен возвращать size_t (без знака), а не int (со знаком). А спецификатор printf() для size_t равен "%zu" (или "%zx" или "%zo" для шестнадцатеричного или восьмеричного). - person Chris Lutz; 15.11.2010

Если вам нужна длина массива символов, используйте sizeof(array)/sizeof(array[0]), если вы хотите длину строки, используйте strlen(array).

person onemasse    schedule 15.11.2010

Для этого также есть компактная форма, если вы не хотите полагаться на strlen. Предполагая, что рассматриваемый вами массив символов - "msg":

  unsigned int len=0;
  while(*(msg+len) ) len++;
person Imre Kiss    schedule 15.05.2014

используя sizeof()

char h[] = "hello";
printf("%d\n",sizeof(h)-1); //Output = 5

используя string.h

#include <string.h>

char h[] = "hello";
printf("%d\n",strlen(h)); //Output = 5

используя функцию (strlen реализация)

int strsize(const char* str);
int main(){
    char h[] = "hello";
    printf("%d\n",strsize(h)); //Output = 5
    return 0;
}
int strsize(const char* str){
    return (*str) ? strsize(++str) + 1 : 0;
}
person Beyondo    schedule 11.01.2018

Вы можете использовать эту функцию:

int arraySize(char array[])
{
    int cont = 0;
    for (int i = 0; array[i] != 0; i++)
            cont++;
    return cont;
}
person slyzion    schedule 08.06.2020
comment
это правильный ответ, чтобы найти количество элементов в массиве - person Sam B; 13.07.2021

Говоря «массив символов», вы имеете в виду строку? Например, «привет» или «хахаха, это строка символов»..

В любом случае используйте strlen(). Почитайте немного об этом, есть много информации об этом, например здесь.

person Poni    schedule 15.11.2010
comment
Если это литерал или char[#], вы можете использовать sizeof, но будьте осторожны и не пытайтесь использовать его на char * - person Chris Lutz; 15.11.2010
comment
Если вы используете sizeof, не забудьте вычесть 1 из нулевого терминатора. - person dan04; 15.11.2010
comment
@ dan04: Только если массив инициализирован с неявной длиной, как в char s[] = "sup";. - person Matt Joiner; 15.11.2010