web-dev-qa-db-ja.com

Cの文字列の配列内の文字列の数を見つける

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

配列内の文字列の数を見つける方法はありますか。たとえば、この場合は3でなければなりません。教えてください。ありがとう。

31
user1128265

この場合、合計サイズを最初の要素のサイズで除算できます。

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

ただし、これはarraysで機能します。ポインターでは機能しません。

33
cnicutar

賞金の例である配列の場合、sizeof(names)/sizeof(names[0])を実行することで配列の長さを決定できます。

例の文字列の長さが異なるという事実は重要ではありません。 nameschar *の配列です。したがって、バイト単位の配列の合計サイズは、配列内の要素数に各要素のサイズを掛けたものです(つまり、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[]が関数パラメーターの場合、配列は最初の要素のアドレスに減衰します。

26
dbush

アレイの作成方法によって異なります。 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);
14

ここで定義しているのは、文字列の配列ではなく、文字へのポインタの配列です。文字列の数を知りたい場合は、ポインタを数えるだけなので、次のようになります

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

このようにして、配列のサイズを単一のポインターのサイズで割っていますが、これは、コンパイル時に配列のサイズがわかっている場合(つまり、配列が静的に割り当てられている場合)にのみ機能することに注意してください動的に定義(つまり、char **文字列)すると、sizeof(strings)は配列ではなくポインタのサイズを返します。

p.s .:文字列の長さは関係ありません。配列はポインターが指すものを「認識」さえしていないからです。

7
hassan arafat
int count = sizeof(names)/sizeof(*names);

これは、namesの合計サイズを取得し、namesの1つの要素のサイズで除算して、3になります。

2
Marlon

配列内の文字列の数を見つける方法はありますか

もちろんあります、これを試してください:

#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
1
Michi

cの文字列の配列内の文字列の数を見つける

配列内のオブジェクトの数を見つける簡単な方法は、配列のサイズを要素の1つのサイズで除算することです。オブジェクトのサイズをバイト単位で返す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から返される型はsize_tであると考えることが重要です。これは、オブジェクトのサイズだけでなく、配列のインデックスを作成できる符号なし整数型です。タイプsize_tの変数を出力するには、修飾子zを使用します。

0
chux

配列内の数値または文字列を返すの簡単な方法の1つは、文字列がなくなるまで配列を反復処理することです。以下に例を示します。

#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ステートメントを閉じます。

0
dotancohen