أضف سلسلة إلى صفيف شار في ج
سؤال
لدي مجموعة C تسمى BUF. هذا هو التعريف:
char buf[1024];
الآن ، يحصل الكود الحالي الخاص بي من stdin
ويستخدم fgets()
لتعيين هذه الصفيف ، ومع ذلك أود استخدام التعليمات البرمجية لتعيينه بدلاً من ذلك. في الوقت الحالي ، يبدو الخط الذي يحدد BUF مثل هذا:
fgets(buf, 1024, stdin);
في الأساس ، أريد استبدال stdin ، مع يقول ... "سلسلة بلدي". ما هي الطريقة المثلى لعمل هذا؟
نصائح أخرى
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 );