[英]strncpy() segmentation fault (again)
我正在嘗試編寫一個帶有數據文件的單詞格式化程序,並對其進行格式化,以便每行最多有一定數量的字符。 當我嘗試循環文件的每一行中的單詞時,我遇到了分段錯誤錯誤。
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的重點嗎? 如果我特意告訴它只將字符復制到低於字符串長度的字符,為什么會出現分段錯誤? 編輯:我已將代碼修改為以下內容:
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 );
如果達到限制中的字符數, strncpy()
不會終止。 你需要null自己終止。 這使得語句strncpy( writeline, "", 0 );
什么都不做(甚至沒有終止字符串)。 然后你添加到那個未初始化的字符串,它會很糟糕。
你告訴它究竟要復制多少個字符,這不是strncpy的重點嗎?
沒有。 關鍵是你告訴它你有多大的緩沖區。 然后它將盡可能多的字符復制到該緩沖區中(將其余部分歸零),如果至少有與緩沖區大小一樣多的字符,則它不會終止。
我個人從不使用它; 實際上總是生成字符串的替代方法包括strcpy
, sprintf
, snprintf
或memcpy
以及手動附加空終止符。
始終建議閱讀標准功能的文檔。 strncpy( writeline, "", 0 );
什么也沒做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.