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