سؤال

لدي مجموعة C تسمى BUF. هذا هو التعريف:

char buf[1024];

الآن ، يحصل الكود الحالي الخاص بي من stdin ويستخدم fgets() لتعيين هذه الصفيف ، ومع ذلك أود استخدام التعليمات البرمجية لتعيينه بدلاً من ذلك. في الوقت الحالي ، يبدو الخط الذي يحدد BUF مثل هذا:

fgets(buf, 1024, stdin);

في الأساس ، أريد استبدال stdin ، مع يقول ... "سلسلة بلدي". ما هي الطريقة المثلى لعمل هذا؟

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

المحلول

يبحث عن sprintf, ، على سبيل المثال هنا: مرجع CPP

يحرر:

sprintf(buf, "My string with args %d", (long) my_double_variable);

تحرير 2:

كما هو مقترح لتجنب الفائض (ولكن هذا واحد هو قياسي ج) يمكنك استخدامه snprintf.

نصائح أخرى

SNPRINTF هو فقط C99 ليس C89 ، Sprintf_S/STRCPY_S هي فقط MSVC ، وليس C89 ، وليس C99.

char *mystr="come from stdin or file or ...";
char buf[1024];
...
memset(buf,0,sizeof buf);
strncpy(buf,mystr,(sizeof buf)-1);

أو غير المصفوفة:

#define BUFLEN 512
char *mystr="come from stdin or file or ...";
char *buf;
...
char *buf=calloc(1,BUFLEN);
strncpy(buf,mystr,BUFLEN-1);

إنه يعمل على جميع بيئات ANSI C.

strcpy(buf, "My String");

يتضمن برنامج التحويل البرمجي لشركة Microsoft أيضًا وظيفة STRCPY_S ، وهو إصدار "آمن" من Strcpy. يتأكد من أنك لن تتغلب buf. في هذه الحالة بالذات ، ربما لا تكون هذه مشكلة ، لكنك تشول. ولكن ، كن على دراية ، فهي غير متوفرة مع أي مترجم آخر ، بحيث لا يمكن استخدامه عند الحاجة إلى المحمول.

 strcpy_s(buf, sizeof(buf), "My String");

هناك العديد من المتغيرات ، وقد تم اقتراح بعضها بالفعل ، بعضها لا:

...

char input[] = "My String";

strcpy(buf, input);

strncpy(buf, input, sizeof(buf));

sscanf(input, "%s", buf);

sprintf(buf, "%s", input);

memcpy(buf, input, strlen(input));

...

معظمهم غير متأكدين/غير آمنين. ما ينبغي أن يعتمد بالضبط يعتمد على ما تريده حقًا افعل في الكود الخاص بك.

يعتبر

RBO

مطول ولكن آمن:

int copy_size = sizeof( buf ) - 1 < strlen( MyString ) ? sizeof( buf ) - 1 : strlen( MyString );
memset( buf, 0, copy_size + 1 );
memcpy( buf, MyString, copy_size );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top