誰かが文字配列の長さを見つけることができるCの方法は何ですか?
私は喜んで擬似コードを受け入れますが、誰かが望むならそれを書き出すことを嫌がりません:)
char配列がnull
終了している場合、
char chararray[10] = { 0 };
size_t len = strlen(chararray);
配列がある場合は、バイト単位の配列のサイズをバイト単位の各要素のサイズで割ることにより、配列内の要素の数を見つけることができます。
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個の要素の配列を指していることだけから判断する方法はありません。その情報を自分で追跡する必要があります。
これを行うには多くの方法があります。要素の数を変数に格納するか、配列の内容をエンコードして、その内容を分析することでサイズを取得できるようにすることができます(これは事実上nullで終了する文字列が行うことです) :'\0'
文字列がいつ終了するかがわかるように、文字列の最後に文字を配置します)。
以前の回答は問題ありませんが、これが私の貢献です。
//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]));
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));
文字配列の長さが必要なsizeof(array)/sizeof(array[0])
場合はを使用し、文字列の長さが必要な場合はを使用しますstrlen(array)
。
strlenに頼りたくない場合は、そのためのコンパクトなフォームもあります。検討している文字配列が「msg」であると仮定します。
unsigned int len=0;
while(*(msg+len) ) len++;
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;
}
この関数を使用できます:
int arraySize(char array[])
{
int cont = 0;
for (int i = 0; array[i] != 0; i++)
cont++;
return cont;
}
「文字配列」とは文字列のことですか?「こんにちは」や「ははは、これは文字列です」のように。
とにかく、strlen()を使用してください。それについて少し読んでください、ここのようにそれについてのたくさんの情報があります。
さて、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
、引数として渡さないことについて厳格でした。それでも、将来これを探しているかもしれない誰かを助けたいと思います!
念のために言っておきますが、誰かがこれを見て、もっと簡単な提案があれば、遠慮なく教えてください。