c - strncpy() 段错误(再次)

标签 c segmentation-fault strncpy

我正在尝试编写一个文字格式化程序,它获取一个数据文件并对其进行格式化,以便每行最多包含一定数量的字符。我在尝试遍历文件每一行中的单词时遇到了段错误。

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 );
                }
            }

这对操作没有任何影响,它仍然是一个段错误。我如何检查 token 是否有效,如果有效,如何仍然访问相同的 token ?


已解决

我开发了一个有效的解决方案:

    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() 不会空终止。您需要终止自己。这使得语句 strncpy( writeline, "", 0 ); 什么都不做(甚至不终止字符串)。然后你添加到那个未初始化的字符串上,它会变得很糟糕。

关于c - strncpy() 段错误(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283739/

相关文章:

c++ - 如何将 SQLite 表设置为 'version'?

c - 如何检查某个时间范围内的事件?

c++ - 段错误 : 11; range-based for loop

c - 分配给作为结构成员的指针会导致段错误

c - Strncpy 和 char **

c - 稀疏矩阵函数

c++ - 控制台(显示)中的双缓冲?

c++ - 这段代码中出现段错误的可能原因是什么?

c - C-使用指针时出现strncpy段错误

c++ - 如何快速复制 std::string 内容?