繁体   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