fwrite和strcat截断字符串并写入无意义的值

时间:2014-07-07 15:28:42

标签: c fwrite strcat

当调用下面显示的函数时,它会将字符串的某些部分写入文本文件。它有时会删除字符,因此闪电号码会出现为" ghtning strik number"。从来没有正确地将击球号码显示为一个角色,它总是出现在闪电号码:&​​#34;。我认为这个问题可能与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 );  
}

3 个答案:

答案 0 :(得分:0)

strcat不会调整你的角色数组的大小,所以行

strcat( stringOne, numberOfStrikes );

溢出数组并且不存储数字。尝试将stringOne的大小增加几个插槽。

答案 1 :(得分:0)

stringOne没有足够的空间。复制到它的初始字符串("Lightning Strike Number: ")已经溢出25个字符的缓冲区,因为字符串是26个字符,包括终止零字符。然后你strcat甚至更多。不要让你的弦乐大小那么小。

答案 2 :(得分:0)

声明两个缓冲区(stringOne和stringTwo)更大。并且不要使用sizeof()strlen。此外,为了提高性能,请通过交换参数sizecount(实际上,计算缓冲区大小并写入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 ) );