سؤال

أنا أبحث عن وسيلة لتحويل رمز مسبق إلى سلسلة.

على وجه التحديد ، حصلت في مكان ما:

#define MAX_LEN 16

وأريد استخدامه لمنع تجاوز المخزن المؤقت:

char val[MAX_LEN+1]; // room for \0
sscanf(buf, "%"MAX_LEN"s", val);

أنا منفتح على طرق أخرى لإنجاز نفس الشيء ، لكن المكتبة القياسية فقط.

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

المحلول

نرى http://www.decompile.com/cpp/faq/file_and_line_error_string.htmخاصة:

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)

لذلك يمكن حل مشكلتك من خلال القيام بذلكsscanf(buf, "%" TOSTRING(MAX_LEN) "s", val);

نصائح أخرى

لقد وجدت إجابة عبر الإنترنت.

#define VERSION_MAJOR 4
#define VERSION_MINOR 47

#define VERSION_STRING "v" #VERSION_MAJOR "." #VERSION_MINOR

ما سبق لا يعمل ، ولكن نأمل أن يوضح ما أود القيام به ، أي جعل الإصدار _string ينتهي به الأمر إلى "v4.47".

لإنشاء النموذج الرقمي المناسب استخدم شيئًا مثل

#define VERSION_MAJOR 4
#define VERSION_MINOR 47

#define STRINGIZE2(s) #s
#define STRINGIZE(s) STRINGIZE2(s)
#define VERSION_STRING "v" STRINGIZE(VERSION_MAJOR) \
"." STRINGIZE(VERSION_MINOR)

#include <stdio.h>
int main() {
    printf ("%s\n", VERSION_STRING);
    return 0;
}

لقد مرت بعض الوقت ، لكن هذا يجب أن ينجح:

 sscanf(buf, "%" #MAX_LEN "s", val);

إذا لم يكن الأمر كذلك ، فسيحتاج إلى خدعة "التوسع المزدوج":

 #define STR1(x)  #x
 #define STR(x)  STR1(x)
 sscanf(buf, "%" STR(MAX_LEN) "s", val);

يجب عليك استخدام خدعة الماكرو الماكرو المزدوجة. أو فقط لديك ملف

#define MAX_LEN    16
#define MAX_LEN_S "16"

char val[MAX_LEN+1];
sscanf(buf, "%"MAX_LEN_S"s", val);

والحفاظ عليه متزامن. (هذا قليلاً من الإزعاج ، ولكن طالما أن التعاريف مباشرة بجوار بعضها البعض ، فمن المحتمل أن تتذكر.)

في الواقع ، في هذه الحالة بالذات ، لا تفعل ذلك strncpy كفى؟

strncpy(val, buf, MAX_LEN);
val[MAX_LEN] = '\0';

لو كان printf, ، رغم ذلك ، سيكون هذا أسهل:

sprintf(buf, "%.*s", MAX_LEN, val);

على الرغم من أن بعضًا من "العمل" أعلاه ، إلا أنني أوصي شخصياً فقط باستخدام واجهة برمجة تطبيقات Simple String بدلاً من Dreck التي تأتي في Libc. هناك عدد من واجهات برمجة التطبيقات المحمولة ، بعضها تم تحسينه أيضًا لسهولة التضمين في مشروعك ... وبعضها يعجبني USTR لديك مساحة صغيرة ودعم لمتغيرات المكدس.

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