英文:
How to pass a variable between function without loose any data
问题
I have a big problem, i have build a code where I catch rtc data and pass it to a string , with this I made the name of the file, based in year/month/day/hour/minuts/seconds. This way I assure there is no way to have two files with same name.
Based in this spintf convertion I send it to another page where I try to creat the file , but something goes wrong because this string does not arrive full.
example:
file1.c
char dateAndTimeFile[];
void setUserDefinedTime(int rtc_year, int rtc_month, int rtc_day, int rtc_hour, int rtc_minute, int rtc_second){
/*CONVERT INTO SINGLE EXPRESSION FOR TIME FILE*/
sprintf(dateAndTimeFile, "HealthFile20%02d%02d%02d%02d%02d%02dLOG.txt",
rtc_year, rtc_month, rtc_day, rtc_hour, rtc_minute, rtc_second);
setParameterCreateInputFile(dateAndTimeFile);
}
file2.c
char *inputfile;
void setParameterCreateInputFile(char str[]){
inputfile = str;
printf("file:%s\n", (TCHAR*)inputfile);
// all FULL string present
SDCARD_Open();
}
void SDCARD_Open(void){
printf("LOAD %s\n", (TCHAR*)inputfile);
//this code appear to be broken only show LOAD Heal
}
英文:
I have a big problem, i have build a code where I catch rtc data and pass it to a string , with this I made the name of the file, based in year/month/day/hour/minuts/seconds. This way I assure there is no way to have two files with same name.
Based in this spintf convertion I send it to another page where I try to creat the file , but something goes wrong because this string does not arrive full.
example:
file1.c
char dateAndTimeFile[];
void setUserDefinedTime(int rtc_year, int rtc_month, int rtc_day, int rtc_hour, int rtc_minute, int rtc_second){
/*CONVERT INTO SINGLE EXPRESSION FOR TIME FILE*/
sprintf(dateAndTimeFile,"HealthFile20%02d%02d%02d%02d%02d%02dLOG.txt",
rtc_year, rtc_month, rtc_day, rtc_hour, rtc_minute, rtc_second);
setParameterCreateInputFile(dateAndTimeFile);
}
file2.c
char *inputfile;
void setParameterCreateInputFile(char str[]){
inputfile = str;
printf("file:%s\n", (TCHAR*)inputfile);
// all FULL string present
SDCARD_Open();
}
void SDCARD_Open(void){
printf("LOAD %s\n", (TCHAR*)inputfile);
//this code appear to be broken only show LOAD Heal
}
答案1
得分: 2
你必须确保数组dateAndTimeFile
足够大,以存储由sprintf
写入的字符串。
在这行
char dateAndTimeFile[];
你没有指定数组的大小,因此无法保证大小足够。
sprintf
写入的字符串长度至少为31个字符(包括空字符则为32)。根据整数参数的值,长度可能更大。
因此,你必须将数组的大小至少设为32字节,如下所示:
char dateAndTimeFile[32];
然而,除非你在内存非常有限的平台上,最好慷慨一些,例如将数组大小设置为100或200字节。否则,你将面临缓冲区溢出的风险。
为了额外的安全性,我建议你使用函数snprintf
来替代sprintf
。这样,即使字符串最终比预期的要长得多,也不会发生缓冲区溢出。
所以,不要使用以下方式:
sprintf(dateAndTimeFile,"HealthFile20%02d%02d%02d%02d%02d%02dLOG.txt",
rtc_year, rtc_month, rtc_day, rtc_hour, rtc_minute, rtc_second);
我建议你改为:
int wants_to_write = snprintf(
dateAndTimeFile, sizeof dateAndTimeFile,
"HealthFile20%02d%02d%02d%02d%02d%02dLOG.txt",
rtc_year, rtc_month, rtc_day,
rtc_hour, rtc_minute, rtc_second
);
if (wants_to_write < 0 || wants_to_write >= sizeof dateAndTimeFile)
{
fprintf(stderr, "写入缓冲区错误!\n");
exit(EXIT_FAILURE);
}
这样,如果缓冲区不够大,你的程序将打印错误消息,而不是溢出缓冲区(可能导致程序崩溃)。
英文:
You must make the array dateAndTimeFile
large enough to store the string written by sprintf
.
In the line
char dateAndTimeFile[];
you are not specifying the size of the array, so it is not guaranteed that the size is sufficient.
The string that sprintf
writes will have a length of at least 31
characters (32
including the null terminating character). Depending on the value of the integer arguments, the length may be larger.
Therefore, you must make the size of the array at least 32 bytes, like this:
char dateAndTimeFile[32];
However, unless you are on a platform with very little memory, it would probably be better to be generous, for example to set the size of the array to 100
or 200
bytes. Otherwise, you will risk a buffer overflow.
For additional safety, I suggest that you use the function snprintf
instead of sprintf
. That way, a buffer overflow cannot occur, even in cases in which the string ends up being significantly longer than intended.
Instead of
sprintf(dateAndTimeFile,"HealthFile20%02d%02d%02d%02d%02d%02dLOG.txt",
rtc_year, rtc_month, rtc_day, rtc_hour, rtc_minute, rtc_second);
I suggest that you write:
int wants_to_write = snprintf(
dateAndTimeFile, sizeof dateAndTimeFile,
"HealthFile20%02d%02d%02d%02d%02d%02dLOG.txt",
rtc_year, rtc_month, rtc_day,
rtc_hour, rtc_minute, rtc_second
);
if ( wants_to_write < 0 || wants_to_write >= sizeof dateAndTimeFile )
{
fprintf( stderr, "Error writing to buffer!\n" );
exit( EXIT_FAILURE );
}
That way, your program will print an error message if the buffer is not large enough, instead of overflowing the buffer (which may cause the program to crash).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论