strncpy()分段错误(再次)

strncpy()分段错误(再次),c,segmentation-fault,strncpy,C,Segmentation Fault,Strncpy,我正在尝试编写一个word格式化程序,它接受一个数据文件,并对其进行格式化,以便每行最多有一定数量的字符。当我试图循环遍历文件每一行中的单词时,遇到了一个分段错误 我不明白为什么会这样。strncpy的目的不是告诉它要复制多少个字符吗?如果我特别告诉它只复制字符串长度以下的字符,为什么会出现分段错误? 编辑:我已将代码修改为以下内容: strcpy(writeLine,strtok(readBuffer,”); while(strcpy(word,strtok(NULL,“”)!=NULL) {

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

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

strcpy(writeLine,strtok(readBuffer,”);
while(strcpy(word,strtok(NULL,“”)!=NULL)
{
if(strlen(word)+strlen(writeLine)
这不会改变操作,仍然是分段错误。如何检查令牌是否有效,如果有效,如何仍然访问相同的令牌


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

    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 );
writeLine[0]='\0';
while(fgets(readBuffer,sizeof(readBuffer),openFile)!=NULL)
{
if(读缓冲区[0]!=EOF)
{               
for(word=readBuffer;NULL!=(word=strtok(word,“\t\n”));word=NULL)
{
printf(“%s\n”,writeLine);
if(strlen(word)+strlen(writeLine)
strncpy()
如果达到限制中的字符数,则不会以null结尾。你需要终止你自己。这使得语句
strncpy(writeline,”,0)不执行任何操作(甚至不终止字符串)。然后添加到未初始化的字符串上,结果会很糟糕

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

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

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


阅读标准函数的文档始终是可取的<代码>strncpy(writeline,”,0)什么也不做。

strtok返回NULL。您能解释一下为什么它会返回NULL,以及可以采取什么措施来避免它吗?strtok在到达缓冲区末尾时返回NULL。在传递strncpy之前,需要检查其返回值。另外,您的while循环是错误的,因为单词永远不会为空。循环应该循环,直到strtok的返回值为NULL应该完成什么?它似乎什么也没做。@shf301,我会做类似while(word=strtok…)的事情吗?chux,我正在将writeLine设置为空,这样我就可以用我的循环附加到它上面。
                        strncpy( word, strtok( NULL, " " ), numChars -1 );
                    }
                    else
                    {
                        fprintf( writeFile, "%s", writeLine );
                        strcpy( writeLine, word );
                        strncpy( word, strtok( NULL, " " ), numChars -1 );
                    }
                }
            }
        }
    }
    
    return rc;
}
            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 );