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個の要素の配列を指していることだけから判断する方法はありません。その情報を自分で追跡する必要があります。

これを行うには多くの方法があります。要素の数を変数に格納するか、配列の内容をエンコードして、その内容を分析することでサイズを取得できるようにすることができます(これは事実上nullで終了する文字列が行うことです) :'\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

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;
}
于 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()メソッドは、要素の数ではなく、引数として渡された文字配列のポインターのサイズを返すため、機能しませんでした。

だから、これは私が思いついた関数です。現在の文字がNULL(または0)であるかどうかをチェックする単純なwhileループ。

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 に答える