إضافة مؤشر إلى سلسلة في C++
سؤال
أنا في حيرة من أمري مع مؤشرات const في C++ وكتبت تطبيقًا صغيرًا لمعرفة النتيجة.أحاول (على ما أعتقد) إضافة مؤشر إلى سلسلة، والتي لا ينبغي أن تعمل بشكل صحيح، ولكن عندما أقوم بتشغيل البرنامج أحصل على "hello World" بشكل صحيح.هل يمكن لأي شخص أن يساعدني في معرفة كيفية عمل هذا السطر (s += s2)؟
رمز بلدي:
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
const char* append(const char* s1, const char* s2){
std::string s(s1); //this will copy the characters in s1
s += s2; //add s and s2, store the result in s (shouldn't work?)
return s.c_str(); //return result to be printed
}
int main() {
const char* total = append("hello", "world");
printf("%s", total);
return 0;
}
المحلول
المتغير s
محلي داخل append
وظيفة.مرة واحدة في append
ترجع الدالة أن المتغير قد تم إتلافه، مما يترك لك مؤشرًا إلى سلسلة لم تعد موجودة.يؤدي استخدام هذا المؤشر إلى سلوك غير محدد.
نصيحتي لك حول كيفية حل هذا:يستخدم std::string
طوال الطريق!
نصائح أخرى
أنت تضيف const char*
المؤشر إلى أ std::string
وهذا ممكن (انظر هذا المرجع).لن يكون من الممكن إجراء تلك العملية char*
اكتب (سلسلة نمط C).
ومع ذلك، فأنت تقوم بإرجاع مؤشر إلى متغير محلي، لذلك بمجرد استخدام الدالة append
إرجاع ويتم ظهوره من المكدس، فإن السلسلة التي يشير إليها المؤشر الذي تم إرجاعه لن تكون موجودة.وهذا يؤدي إلى سلوك غير محدد.
تم تحميل الفئة std::string بشكل زائد operator +=
لمعامل من النوع const char *
basic_string& operator+=(const charT* s);
في الواقع، يقوم ببساطة بإلحاق السلسلة التي يشير إليها هذا المؤشر بمحتويات الكائن من النوع std::string وتخصيص الذاكرة الإضافية إذا لزم الأمر.على سبيل المثال، يمكن للمشغل المحمل بشكل زائد داخليًا استخدام وظيفة C القياسية strcat
من الناحية النظرية، فهو مشابه لمقتطف التعليمات البرمجية التالي.
char s[12] = "Hello ";
const char *s2 = "World";
std::strcat( s, s2 );
ضع في اعتبارك أن برنامجك له سلوك غير محدد لأنه total
سيكون غير صالح بعد تدمير الكائنات المحلية بعد الخروج من إلحاق الوظيفة.إذن البيان التالي بشكل رئيسي
printf("%s", total);
يمكن أن يؤدي إلى سلوك غير محدد.