إرجاع char1 + char2؟ أليس من الممكن؟
سؤال
أحاول إعادة سلسلة من وظيفة. الذي يضيف بشكل أساسي بعض chars معًا وإرجاع تمثيل السلسلة.
string toString() {
char c1, c2, c3;
// some code here
return c1 + c2; // Error: invalid conversion from `char' to `const char*'
}
من الممكن إرجاع القيم المنطقية مثل الإرجاع C1 == 'x'. أليس من الممكن إرجاع قيم السلسلة؟ أعلم أنه من الممكن أن يكون الأمر كذلك:
string result;
result.append(c1, c2);
return result;
أنا جديد على C ++ لذلك اعتقدت أنه يجب أن يكون هناك حل أكثر أناقة.
المحلول
لا ، لا يمكنك فعل ذلك لأن إضافة اثنين من char معا لا يمنحك سلسلة. يمنحك شار آخر. في هذه الحالة 'a'+'b'
في الواقع يعطيك '├'
(على Windows مع المعيار CP_ACP صفحة الكود). char هو نوع ترتيبي ، مثل الأعداد الصحيحة والمترجم يعرف فقط كيفية إضافتها بأكثر الطرق الأساسية. السلاسل هي وحش مختلف تماما.
يمكنك القيام بذلك ، ولكن عليك أن تكون صريحًا:
return string(1, c1) + string(1, c2)
سيؤدي ذلك إلى بناء سلسلتين مؤقتتين ، تم تهيئة كل منهما إلى تكرار واحد للشخصية التي تم تمريرها كمعلمة ثانية. حيث operator+
يتم تعريفه على الأوتار لتكون وظيفة تسلسل ، يمكنك الآن القيام بما تريد.
نصائح أخرى
char
الأنواع في C ++ (وكذلك في C) هي أنواع متكاملة. أنها تتصرف كنوع لا يتجزأ. تماما مثل عندما تكتب 5 + 3
في الكود الخاص بك ، تتوقع أن تصبح جزءًا لا يتجزأ 8
نتيجة (وليس سلسلة "53"
)، عندما تكتب c1 + c2
في الكود الخاص بك أعلاه ، يجب أن تتوقع الحصول على نتيجة متكاملة - مجموع الحساب لـ c1
و c2
.
إذا كنت تريد بالفعل سلسل حرفين لتشكيل سلسلة ، عليك القيام بذلك بشكل مختلف. هناك العديد من الطرق للقيام بذلك. على سبيل المثال ، يمكنك تشكيل سلسلة على غرار C.
char str[] = { c1, c2, `\0` };
التي سيتم تحويلها ضمنيًا إلى std::string
بواسطة
return str;
أو يمكنك بناء ملف std::string
على الفور (والتي يمكن القيام بها أيضًا بعدة طرق مختلفة).
يمكنك تحويل كل char إلى سلسلة ثم استخدام +:
return string(1, c1)+string(1, c2);
بالتناوب ، يحتوي String على تحميل + مشغل للعمل مع الأحرف ، حتى تتمكن من الكتابة:
return string(1, c1) + c2;
بغض النظر عن الطريقة التي تختارها ، ستحتاج إلى تحويل النوع المتكامل char
إما إلى سلسلة على غرار C (char*
) أو سلسلة نمط C ++ (std::string
).
return string(1, c1) + c2;
هذا يبني سلسلة واحدة من الشحن ، تحتوي على C1 ، ثم يضيف (محملة إلى Concatenate) C2 (إنشاء سلسلة أخرى) ، ثم إرجاعها.
لا ، إنها تضيف فقط رموز الأحرف. تحتاج إلى تحويلها إلى سلاسل.
تحتاج إلى إنشاء سلسلة من chars.
ثم أعد السلسلة (في الواقع نسخة من السلسلة)