gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:31:27 25 4
gpt4 key购买 nike

当调用下面所示的函数时,它将字符串的某些部分写入文本文件。它有时会删除字符,因此雷击编号将显示为“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 );
}

最佳答案

声明两个缓冲区(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 ) );

关于c - fwrite 和 strcat 截断字符串并写入无意义的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com