簡體   English   中英

strncpy()分段錯誤(再次)

[英]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的重點嗎?

沒有。 關鍵是你告訴它你有多大的緩沖區。 然后它將盡可能多的字符復制到該緩沖區中(將其余部分歸零),如果至少有與緩沖區大小一樣多的字符,則它不會終止。

我個人從不使用它; 實際上總是生成字符串的替代方法包括strcpysprintfsnprintfmemcpy以及手動附加空終止符。

始終建議閱讀標准功能的文檔。 strncpy( writeline, "", 0 ); 什么也沒做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM