79

在 C 中,有人可以找到字符数组的长度的方法是什么?

我很乐意接受伪代码,但我不反对有人写出来,如果他们愿意:)

4

10 回答 10

104

如果 char 数组被null终止,

char chararray[10] = { 0 };
size_t len = strlen(chararray);
于 2010-11-15T01:43:47.497 回答
32

如果你有一个数组,那么你可以通过将数组的大小(以字节为单位)除以每个元素的大小(以字节为单位)来找到数组中的元素数:

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

对于 的特定情况char,因为sizeof(char) == 1sizeof(x)将产生相同的结果。

如果您只有一个指向数组的指针,则无法找到指向数组中元素的数量。您必须自己跟踪。例如,给定:

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

pointer_to_x仅凭它指向一个由 10 个元素组成的数组是无法判断的。您必须自己跟踪这些信息。

有很多方法可以做到这一点:您可以将元素的数量存储在变量中,也可以对数组的内容进行编码,以便您可以通过分析其内容以某种方式获取其大小(这实际上是以空结尾的字符串所做的:他们'\0'在字符串的末尾放置一个字符,以便您知道字符串何时结束)。

于 2010-11-15T01:46:47.137 回答
15

尽管早期的答案还可以,但这是我的贡献。

//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;
}

在您的 main 函数中,您通过传递数组第一个元素的地址来调用 size 函数。

例如:

char myArray[] = {'h', 'e', 'l', 'l', 'o'};
printf("The size of my character array is: %d\n", size(&myArray[0]));
于 2011-04-02T06:54:59.630 回答
8

您可以使用 strlen

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));
于 2010-11-15T01:59:27.990 回答
6

如果你想使用字符数组的长度sizeof(array)/sizeof(array[0]),如果你想使用字符串的长度strlen(array)

于 2010-11-15T05:03:14.877 回答
2

如果您不想依赖 strlen,还有一个紧凑的形式。假设您正在考虑的字符数组是“msg”:

  unsigned int len=0;
  while(*(msg+len) ) len++;
于 2014-05-15T07:54:04.000 回答
1

使用sizeof()

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

使用字符串.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;
}
于 2018-01-11T05:56:43.740 回答
1

您可以使用此功能:

int arraySize(char array[])
{
    int cont = 0;
    for (int i = 0; array[i] != 0; i++)
            cont++;
    return cont;
}
于 2020-06-08T17:16:59.307 回答
0

说“字符数组”是指字符串?像“你好”或“哈哈哈这是一串字符”..

无论如何,使用strlen()。阅读一些关于它的信息,有很多关于它的信息,比如这里

于 2010-11-15T01:44:34.663 回答
0

好吧,11 年后,我在大学作业中遇到了这个问题。我找到的解决方案无需更改作业要求的函数签名即可工作。

就我而言,我必须创建一个函数,如果项目存在或取决于 itemPrefix (例如香蕉的“B”)是否已经存在于字符数组 itemPrefixes 中,则返回项目索引以避免传递重复的前缀。

所以,我不得不使用for循环(或while循环)。问题是分配给了我每个函数的特定签名,并且对于那个特定的函数,它不允许我将函数count上的变量main()作为参数传递。

我不得不即兴发挥。

上面提到的两种方法都不起作用。strlen()没有按预期工作,因为'\0'字符串没有结束字符。该sizeof()方法也不起作用,因为它返回了作为参数传入的字符数组指针的大小,而不是元素的数量。

所以,这就是我想出的功能。一个简单的 while 循环,用于检查当前字符是否为NULL(或0)。

void charArrLength(char array[]) {
    int arrLength = 0;
    
    while (array[arrLength] != 0) {
        arrLength++; //increment by 1
    } 
    
    printf("Character array has %d elements", arrLength);
}

但是,要使其工作,在main()函数中,您需要将字符数组声明为字符指针,然后根据您最终希望在数组中拥有的项目数分配所需的内存。

void charArrLength(char array[]) {
    int arrLength = 0; 
    
    while (array[arrLength] != 0) {
        arrLength++; 
    } 
    
    printf("Character array has %d elements", arrLength); //should give 33
} 

int main() { 
    char *array; //declare array as a pointer
    int arraySize = 33; //can be anything 
    
    array = (char*) malloc(arraySize * sizeof(char)); 
    
    charArrLength(array);

    free(array); //free the previously allocated memory
}

下面你会看到我是如何在我的作业中使用这个功能的。

首先,这是根据我的需要量身定制的上述功能。

int isItemExists(char itemPrefixes[], char itemPrefix) {
    int count = 0; //declare count variable and set to 0
    int itemIndex = -1; //declare item index variable and set it to -1 as default

    while (itemPrefixes[count] != 0) {
        count++;
    }

    for (int i = 0; i < count; i++) {
        if (itemPrefix == itemPrefixes[i]) {
            itemIndex = i; //if item exists, set item index to i
        }
    }

    return itemIndex;
}

然后,我如何itemPrefixes在函数中声明数组main()以及如何根据n (用户想要添加到itemPrefixes数组的项目数)分配所需的内存。

char *itemPrefixes;
    
int n = 0; //number of items to be added variable

printf("> Enter how many items to add: ");
scanf("%d", &n);

//allocate n * size of char data type bytes of memory
itemPrefixes = (char*) malloc(n * sizeof(char));

最后,这是该功能的使用方式。

do {
    printf("\n\n> Enter prefix for item %d: ", i + 1);
    scanf(" %c", &itemPrefix);
    
    //prompt the user if that itemPrefix already exists
    if (isItemExists(itemPrefixes, itemPrefix) != -1) {
        printf("\nItem prefix already exists! Try another one.\n");
    }
} while (isItemExists(itemPrefixes, itemPrefix) != -1);

此外,在代码的最后,我释放了之前分配的内存。

free(itemPrefixes);

再次清除这一点,如果条件不同,这可能会容易得多。该作业严格要求不n作为参数传递。尽管如此,我希望我能帮助其他可能在未来寻找这个的人!

只是为了它,如果有人看到这个并且有更简单的建议,请随时告诉我。

于 2022-01-16T23:50:19.990 回答