首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strncpy()分段错误(再次)

strncpy()分段错误(再次)
EN

Stack Overflow用户
提问于 2014-04-25 03:40:50
回答 2查看 437关注 0票数 0

我正在尝试写一个字格式化程序,它接受一个数据文件,并对它进行格式化,以便每行有最多一定数量的字符。当我试图遍历文件的每一行中的单词时,我遇到了一个分段错误。

代码语言:javascript
运行
复制
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 );

我在这里得到了错误:

代码语言:javascript
运行
复制
                        strncpy( word, strtok( NULL, " " ), numChars -1 );
                    }
                    else
                    {
                        fprintf( writeFile, "%s", writeLine );
                        strcpy( writeLine, word );
                        strncpy( word, strtok( NULL, " " ), numChars -1 );
                    }
                }
            }
        }
    }
    
    return rc;
}

我不明白为什么会这样。strncpy的重点不是告诉它要复制多少个字符吗?如果我专门告诉它只复制字符串长度以下的字符,为什么会出现分段错误?编辑:我已将代码修改如下:

代码语言:javascript
运行
复制
            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 );
                }
            }

这不会改变操作,它仍然是一个分割错误。如何检查令牌是否有效,如果是的话仍然访问相同的令牌?

解出

我开发了一个可行的解决方案:

代码语言:javascript
运行
复制
    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 );
EN

回答 2

Stack Overflow用户

发布于 2014-04-25 04:24:31

如果达到限制中的字符数,则strncpy()不为null。你需要完全终止你自己。这使得语句strncpy( writeline, "", 0 );什么也不做(甚至没有终止字符串)。然后,将未初始化的字符串添加到该字符串中,结果会非常糟糕。

票数 1
EN

Stack Overflow用户

发布于 2014-04-25 04:29:20

strncpy的重点不是告诉它要复制多少个字符吗?

不是的。关键是你告诉它你有多大的缓冲区可用。然后,它将尽可能多的字符复制到该缓冲区中(对其余字符进行零化),并且如果至少有与缓冲区大小相同的可用字符,则不为null终止。

就我个人而言,我从不使用它;实际上总是生成字符串的替代方法包括strcpysprintfsnprintfmemcpy,以及手动附加空终止符。

阅读标准函数的文档总是可取的。strncpy( writeline, "", 0 );什么也不做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23283739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档