データ ファイルを取得し、1 行あたりの文字数が一定量になるように書式設定する単語書式設定プログラムを作成しようとしています。ファイルの各行の単語をループしようとすると、セグメンテーション違反エラーが発生します。
int readFile( )
{
int rc = 1;
char readBuffer[ 256 ];
char writeLine[ 256 ];
char *word = malloc( numChars * sizeof( char ) );
writeFile = fopen( writeName, "a" );
if ( ( openFile = fopen( readName, "r" ) ) == NULL )
{
printf( "Unable to open %s file for read\n", readName );
rc = 0;
}
else
{
while( fgets( readBuffer, sizeof( readBuffer ), openFile) != NULL )
{
strncpy( writeLine, "", 0 );
if ( readBuffer[0] != EOF )
{
strncpy( word, strtok( readBuffer, " " ), numChars -1 );
while( word != NULL )
{
if( strlen( word ) + strlen( writeLine ) < numChars )
{
strcat( writeLine, word );
ここでエラーが発生します:
strncpy( word, strtok( NULL, " " ), numChars -1 );
}
else
{
fprintf( writeFile, "%s", writeLine );
strcpy( writeLine, word );
strncpy( word, strtok( NULL, " " ), numChars -1 );
}
}
}
}
}
return rc;
}
なぜこれが起こっているのかわかりません。コピーする文字数を正確に伝えることがstrncpyのポイントではありませんか?文字列の長さの 1 つ下まで文字をコピーするように具体的に指示した場合、なぜセグメンテーション違反が発生するのでしょうか? 編集:コードを次のように修正しました。
strcpy( writeLine, strtok( readBuffer, " " ) );
while( strcpy( word, strtok( NULL, " " ) ) != NULL )
{
if( strlen( word ) + strlen( writeLine ) < numChars )
{
strcat( writeLine, word );
}
else
{
fprintf( writeFile, "%s", writeLine );
strcpy( writeLine, word );
}
}
これは操作に変更を与えません。これは依然としてセグメンテーション違反です。トークンが有効であることを確認し、有効な場合は同じトークンにアクセスするにはどうすればよいですか?
解決済み
機能するソリューションを開発しました:
writeLine[0] = '\0';
while( fgets( readBuffer, sizeof( readBuffer ), openFile) != NULL )
{
if ( readBuffer[0] != EOF )
{
for( word = readBuffer; NULL != ( word = strtok( word, " \t\n" ) ); word=NULL )
{
printf("%s\n", writeLine );
if( strlen( word ) + strlen( writeLine ) < numChars )
{
strcat( writeLine, word );
strcat( writeLine, " " );
}
else
{
printf("%s", "print\n");
fprintf( writeFile, "%s\n", writeLine );
strcpy( writeLine, word );
strcat( writeLine, " " );
}
}
}
}
fprintf( writeFile, "%s\n", writeLine );