سؤال

أعلنت صفيف شار ثابت ، ثم أقوم بتمريرها إلى وظيفة. كيف تحصل على لا. من البايتات في الصفيف داخل الوظيفة؟

هل كانت مفيدة؟

المحلول

سيكون عليك تمريرها إلى الوظيفة. يمكنك استخدام SizeOF () للحصول على حجم صفيف.

const char foo[] = "foobar";

void doSomething( char *ptr, int length)
{

}


doSomething(foo, sizeof(foo));

هذه صفحة MSDN يشرح المزيد حول حجمه وله مثال أكبر.

يحرر: * انظر إجابة j_random_hacker للحصول على تقنية مثيرة للاهتمام باستخدام قوالب ... *

نصائح أخرى

استخدم قالب الوظيفة بدلاً من ذلك يحتوي على معلمة قالب غير من النوع:

template <size_t N>
void func(char (&a)[N]) {
    for (int i = 0; i < N; ++i) {
        cout << "a[" << i << "] = " << a[i] << endl;   // Or whatever you want to do
    }
}

للإتصال:

char myArray[500];        // Or "static char myArray[500]", if you want
func(myArray);

سيتم إنشاء نسخة جديدة من هذه الوظيفة لكل حجم مميز من الصفيف الذي يتم استدعاؤه معها ، لذلك إذا قمت بتسميتها مع العديد من المصفوفات المختلفة الحجم ، فستحصل على بعض الرموز. ولكن من غير المحتمل أن يكون هذا هو الحال.

لا. لا تستخدم المصفوفات. استخدم ناقل بدلاً من ذلك. في هذه الأيام لا يوجد أي عذر تقريبًا لاستخدام المصفوفات لأنها غير آمنة. AFAIK ، فهي واحدة من الأسباب الرئيسية لمشاكل البرمجيات لأنه من السهل للغاية تجاوز نهاية الصفيف بطريق الخطأ.

باستخدام ناقل ، لا داعي للقلق بشأن التجاوزات العازلة. ويمكن لوظائفك أن تكتشف بسهولة حجم Vecor.

#include <vector>
vector<char> myVector;

void DoSomething(vector<char> &v)
{
    int sizeOfVector = v.size();
}

int array_size = sizeof (Array) / sizeof (Array [0]) ؛

تستطيع ايضا استخذام std::size() من C ++ 17

https://en.cppreference.com/w/cpp/iterator/size

#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}

ل PRE C ++ 17 نسخ تطبيقات تطبيقات ؛)

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}

لا يمكنك. المصفوفات في C ++ هي مؤشرات ، وهذا هو كل ما لديك: المؤشر إلى بداية الصفيف. إذا حدث أن تكون سلسلة ، فيمكنك استخدام Strlen لقياس طولها. إذا كان هناك تنسيق معروف آخر ، فيمكنك حساب الطول وفقًا لهذا التنسيق.

النظر في هذا الرمز:

static char str[] = "hello world";

foo(str);
bar(str);

void foo(char* str)
{
   // length of str is unknown
}

void bar(char str[])
{
  // length of str is still unknown
}

بغض النظر عما إذا كانت معلمة وظيفتك هي char [] أو char*، فأنت لا تعرف الحجم.

أقترح تمرير الحجم كمعلمة منفصلة.

خيار آخر لديك هو إنشاء فئة سلسلة تدير السلسلة. أنا متأكد من أن شخصًا ما قد فعل هذا بالفعل. النسخة الأكثر بدائية هي البنية ذات الطول المشوي * وطول المخزن المؤقت ، حيث يتعين عليك إدارة الحجم يدويًا كلما تغير. الطرف الآخر من الطيف عبارة عن فئة سلسلة يتم تنفيذها بالكامل ، مع وظائف التحميل الزائد والمشغل.

ثم مرر هذا الفصل إلى وظيفتك وهو يعرف الحجم بالفعل. لا يختلف الأمر حقًا ثم تمريره كمعلمة منفصلة ؛ إنها ببساطة طريقة أسهل لإدارة السلاسل إذا كانت جميعها أطوالًا مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top