簡體   English   中英

在C中查找字符串數組中的字符串數

[英]Find the number of strings in an array of strings in C

char* names[]={"A", "B", "C"};

有沒有辦法找到數組中的字符串數? 例如,在這種情況下,它應該輸出:3。

在這種情況下,您可以將總大小除以第一個元素的大小:

num = sizeof(names) / sizeof(names[0]);

不過要小心,這適用於數組 它不適用於指針。

對於一個數組,賞金中的例子是,執行sizeof(names)/sizeof(names[0])就足以確定數組的長度。

示例中的字符串長度不同這一事實無關緊要。 names是一個char *數組,因此以字節為單位的數組總大小是數組中元素的數量乘以每個元素的大小(即char * )。 這些指針中的每一個都可以指向任意長度的字符串,或者指向 NULL。 沒關系。

測試程序:

#include<stdio.h>

int main(void)
{
    char* names1[]={"A", "B", "C"}; // Three elements
    char* names2[]={"A", "", "C"}; // Three elements
    char* names3[]={"", "A", "C", ""}; // Four elements
    char* names4[]={"John", "Paul", "George", "Ringo"}; // Four elements
    char* names5[]={"", "B", NULL, NULL, "E"}; // Five elements

    printf("len 1 = %zu\n",sizeof(names1)/sizeof(names1[0]));
    printf("len 2 = %zu\n",sizeof(names2)/sizeof(names2[0]));
    printf("len 3 = %zu\n",sizeof(names3)/sizeof(names3[0]));
    printf("len 4 = %zu\n",sizeof(names4)/sizeof(names4[0]));
    printf("len 5 = %zu\n",sizeof(names5)/sizeof(names5[0]));
}

輸出:

len 1 = 3
len 2 = 3
len 3 = 4
len 4 = 4
len 5 = 5

編輯:

澄清一下,這僅在您定義了一個數組時才有效,即char *names[]char names[][] ,並且您在定義數組的范圍內。 如果它被定義為char **names那么你有一個指針作為一個數組,上面的技術將不起作用。 類似地,如果char *names[]是一個函數參數,在這種情況下,數組會衰減到第一個元素的地址。

這取決於您的陣列是如何創建的。 在 C 中,沒有辦法檢查作為指針的數組的長度,除非它有一個哨兵元素,或者一個整數作為數組中元素的計數與數組一起傳遞。 在你的情況下,你可以使用這個:

int namesLen = sizeof(names) / sizeof(char);

但是,如果您的數組是指針,

char **names = { "A", "B", "C" };

您可以有一個整數,該整數對於數組的長度是恆定的:

int namesLen = 3;

或者添加一個標記值(例如 NULL)

char **names = { "A", "B", "C", NULL };

int namesLen = -1;
while (names[++namesLen] != NULL) { /* do nothing */}

// namesLen is now the length of your array

作為另一種方式,您可以創建一個填充了您想要的值的結構:

struct Array {
    void **values;
    int length;
};

#define array(elements...) ({ void *values[] = { elements }; array_make(values, sizeof(values) / sizeof(void *)); })
#define destroy(arr) ({ free(arr.values); })

struct Array array_make(void **elements, int count)
{
    struct Array ret;
    ret.values = malloc(sizeof(void *) * count);
    ret.length = count;

    for (int i = 0; i < count; i++) {
        ret.values[i] = elements[i];
    }

    return ret;
}

你會這樣使用它:

struct Array myArray = array("Hi", "There", "This", "Is", "A", "Test");
// use myArray

printf("%i", myArray.length);
destroy(myArray);

您在這里定義的並不是字面上的字符串數組,而是指向字符的指針數組。 如果你想知道字符串的數量,你只需要計算指針,比如

size_t size = sizeof(names)/sizeof(char*);

會這樣做,這樣你就可以將數組的大小除以單個指針的大小。動態定義(即 char** 字符串)然后sizeof(strings)將返回指針的大小而不是數組。

ps:字符串的長度不相關,因為數組甚至“不知道”指針指向什么。

有沒有辦法找到數組中的字符串數

當然有,試試這個:

#include<stdio.h>

int main(void){
    size_t size, i=0;
    int count=0;
    char* names[]={"A", "B", "C"};

    size = sizeof(names)/sizeof(char*);

    for(i=0;i<size;i++){
        printf("%d - %s\n",count+1, *(names+i));
        count++;
    }

    printf("\n");
    printf("The number of strings found are %d\n",count);
    return 0;
}
 1 - A 2 - B 3 - C
The number of strings found are 3

同樣的事情:

#include<stdio.h>

int main(void){
    size_t size, i=0;
    int count=0;
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"};

    size = sizeof(names)/sizeof(char*);

    for(i=0;i<size;i++){
        printf("%d - %s\n",count+1, *(names+i));
        count++;
    }

    printf("\n");
    printf("The number of strings found are %d\n",count);
    return 0;
}

輸出:

 1 - Jimmy 2 - Tom 3 - Michael 4 - Maria 5 - Sandra 6 - Madonna
The number of strings found are 6

或者使用這樣的函數:

#include<stdio.h>

size_t arrLength(size_t len, char **arr){
    size_t i=0;
    size_t count=0;

    for(i=0;i<len;i++){
        printf("%zu - %s\n",count+1, *(arr+i));
        count++;
    }

    return count;
}

int main(void){
    char *names[]={"Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna"};
    size_t length,size;

    size = sizeof(names)/sizeof(char*);
    length = arrLength(size, names);

    printf("\n");
    printf("The number of strings found are %zu\n",length);
    return 0;
}

輸出:

 1 - Jimmy 2 - Tom 3 - Michael 4 - Maria 5 - Sandra 6 - Madonna
The number of strings found are 6
int count = sizeof(names)/sizeof(*names);

這需要的總大小names由一個元件的尺寸和將其划分names ,導致3。

返回數組中的數字或字符串的一種簡單方法是迭代數組,直到用完字符串。 這是一個例子。

#include <stdio.h>

int main()
{
    char* names[] = {"John", "Paul", "George", "Ringo", '\0'};

    int size = 0;
    while(names[++size]!='\0');

    printf("Size: %d\n", size); // Prints "4"

    return 0;
}

這種方法的優點是,即使字符串的長度不同,它也能工作。 請注意names數組中的終止 NULL 字節,以及; 字符來關閉while語句,因為沒有要運行的語句體。

在 C 中的字符串數組中查找字符串的數量

查找數組中對象數量的簡單方法是將數組的大小除以其中一個元素的大小。 使用sizeof運算符返回對象的大小(以字節為單位)。

// For size_t
#include <stddef.h>

char* names[] = { "A", "B", "C" };
size_t number_of_strings = sizeof names / sizeof names[0];

printf("Number of strings %zu\n", number_of_strings);

重要的是要考慮從sizeof返回的sizeofsize_t ,這是一種無符號整數類型,能夠索引任何數組以及任何對象的大小。 要打印size_t類型的變量,請使用修飾符z

以下會回答什么

size_t arrLength( char** arr) {
    size_t i = 0;
    size_t count = 0;
    int len;
   len = sizeof(**arr) / sizeof(arr[0]);
    for (i = 0; i < len; i++) {
        printf("%zu - %s\n", count + 1, *(arr + i));
        count++;
    }

    return count;
}

int main(void) {
    char* names[] = { "Jimmy", "Tom", "Michael", "Maria", "Sandra", "Madonna" };
    size_t length, size;

    //size = sizeof(names) / sizeof(names[0]);
    length = arrLength(names);

    printf("\n");
    printf("The number of strings found are %zu\n", length);
    return 0;
}

我得到 1

使字符串數組在帶有增量運算符的While 循環中運行,直到循環變為NULL ,給出數組大小:

#include<stdio.h>
char* names[]={"A", "B", "C"};

int main(){
int nameSize = 0;
while(names[++nameSize]!='\0');
}

for(i=0;i<nameSize;i++){
printf("%s\n", names[i]);
}

return 0;
}

輸出:

A
B
C

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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