انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: ابو مصعب در 31 شهریور 1401، 12:51 ق‌ظ

عنوان: حافظه تکراری در c
ارسال شده توسط: ابو مصعب در 31 شهریور 1401، 12:51 ق‌ظ
سلام یک برنامه لاگ همین جوری برای c  نوشته بودم که قابلیت رنگ داشت . اما متوجه شدم یک چیزی غیر عادیه . این بود که فایل main.c به شرح زیر :‌#include <stdio.h>
#include "includes/log.c"
int main() {
    normal("going to RUN");
    warning("gggg");
    dangerous("adfasdf");


}


و فایل log.c :


#include <stdio.h>
#include <string.h>
// colors :
#define RED    "\e[31m"
#define GREEN  "\e[32m"
#define YELLOW "\e[33m"
// rest code :
#define REST   "\e[0m"


void println(const char *text){
printf("%s\n",text);
}
void normal(const char *text ) {
println(text);
}
void warning(const char *text) {
char final_msg[100];
strcat(final_msg,YELLOW);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}
void dangerous(const char *text) {
char final_msg[100];
strcat(final_msg,RED);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}



اما خروجی این بود :‌
going to RUN
gggg
ggggadfasdf

همون طور که میبیند gggg که مثلا برا هشداره دوبار داره نمایش داده میشه . و وقتی کد رو به این صورت تغییر دادم :‌

void dangerous(const char *text) {
char final_msg[100];
println(final_msg);
strcat(final_msg,RED);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}


متوجه شدم که متغیر final_msg هنو مقداری رو داره که توی فانکشن بالایی مشابهش وجود داره و هنو همون مقدار رو داره . اما مگه تو سی متغیر ها از هم جدا نیستند ؟ چرا این اتفاق میوفته ؟‌
عنوان: پاسخ : حافظه تکراری در c
ارسال شده توسط: esmaeelE در 09 آبان 1401، 02:30 ب‌ظ
باید آرایهٔ کاراکتری را مقدار دهی اولیه کنید.
char final_msg[100]={0};


کد‌های e\ غیر استاندارد است. توصیه شده که به جای اون از 33\ استفاده کنید.
https://stackoverflow.com/a/37204129/7508077

با این تغییرات کد به این شکل می‌شود.


#include <stdio.h>
#include <string.h>

// colors :
#define RED    "\033[31m"
#define GREEN  "\033[32m"
#define YELLOW "\033[33m"
#define REST   "\033[0m"


void println(const char *text){
printf("%s\n",text);
}
void normal(const char *text ) {
println(text);
}
void warning(const char *text) {
char final_msg[100]={0};
strcat(final_msg,YELLOW);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}
void dangerous(const char *text) {
char final_msg[100]={0};
strcat(final_msg,RED);
strcat(final_msg,text);
strcat(final_msg,REST);
println(final_msg);
}

int main(void) {
    normal("going to RUN");
    warning("gggg");
    dangerous("adfasdf");
    return 0;
}


می‌توانید برای کار با رشته‌ها از توابع امن‌تری چون strncat هم استفاده کنید.
void dangerous(const char *text) {
char final_msg[100];
strncat(final_msg,RED, strlen(RED));
strncat(final_msg,text, strlen(text));
strncat(final_msg,REST, strlen(REST));
println(final_msg);
}