当调用下面显示的函数时,它会将字符串的某些部分写入文本文件。它有时会删除字符,因此闪电号码会出现为" ghtning strik number"。从来没有正确地将击球号码显示为一个角色,它总是出现在闪电号码:"。我认为这个问题可能与strcat有关,但我无法弄清楚原因,任何帮助都会受到赞赏。
void recordLightningStrike( int strikeNumber, char fileName[], FILE *filePointer )
{
time_t systemTime;
struct tm *UTCTime;
char numberOfStrikes[6];
char strikeTime[24];
char stringOne[25];
char stringTwo[55];
//char finalString[200];
itoa( strikeNumber, numberOfStrikes, 10 );
time( &systemTime );
UTCTime = localtime( &systemTime );
strcpy( strikeTime, asctime( UTCTime ) );
strcpy( stringOne, "Lightning Strike Number: " );
strcpy( stringTwo, "Lightning Strike Occurred at: " );
strcat( stringOne, numberOfStrikes );
strcat( stringTwo, strikeTime );
//strcpy( finalString, stringOne );
//strcat( finalString, stringTwo );
printf( " %s %c ", stringOne, '\n' );
FILE *openPointer = fopen( fileName, "a" );
if( openPointer!=NULL )
{
fwrite( stringOne, sizeof(char), sizeof(stringOne), openPointer );
fwrite( stringTwo, sizeof(char), sizeof(stringTwo), openPointer );
}
fclose( openPointer );
}
答案 0 :(得分:0)
strcat不会调整你的角色数组的大小,所以行
strcat( stringOne, numberOfStrikes );
溢出数组并且不存储数字。尝试将stringOne的大小增加几个插槽。
答案 1 :(得分:0)
stringOne
没有足够的空间。复制到它的初始字符串("Lightning Strike Number: "
)已经溢出25个字符的缓冲区,因为字符串是26个字符,包括终止零字符。然后你strcat
甚至更多。不要让你的弦乐大小那么小。
答案 2 :(得分:0)
声明两个缓冲区(stringOne和stringTwo)更大。并且不要使用sizeof()
但strlen
。此外,为了提高性能,请通过交换参数size
和count
(实际上,计算缓冲区大小并写入1
缓冲区)立即写入每个缓冲区:
.
.
.
char stringOne[50]; // guess; you could compute it more tightly
char stringTwo[60]; // guess; you could compute it more tightly
.
.
.
fwrite( stringOne, sizeof(char) * strlen(stringOne), 1, openPointer );
fwrite( stringTwo, sizeof(char) * strlen(stringTwo), 1, openPointer );
.
.
.
上述调整可能会纠正您的计划。但是,您可以使用snprintf()
打印到缓冲区,或者更好的是fprintf()
直接打印到FILE*
:
fprintf( openPointer, "Lightning Strike Number: %d\n", strikeNumber );
fprintf( openPointer, "Lightning Strike Occurred at: %s\n", asctime( UTCTime ) );