读取文件并获取字符串长度

时间:2010-07-31 10:13:37

标签: c fgets

gcc 4.4.4 c89

我使用以下代码使用fgets读入文件。我只想获得可能是M或F的性别。

但是,因为性别始终是字符串中的最后一个字符。我以为我可以通过使用strlen获得角色。但是,出于某种原因,我必须得到strlen和minus 2.我知道strlen不包括nul。但是,它将包括回车。

我正在阅读的文字的确切内容是:

"Low, Lisa" 35 F

我的代码:

int read_char(FILE *fp)
{
#define STRING_SIZE 30
    char temp[STRING_SIZE] = {0};
    int len = 0;

    fgets(temp, STRING_SIZE, fp);

    if(temp == NULL) {
        fprintf(stderr, "Text file corrupted\n");
        return FALSE;
    }

    len = strlen(temp);
    return temp[len - 2];
}

当我觉得它应该返回16时,strlen返回17.字符串长度包括回车符。我觉得我应该做 - 1而不是 - 2.

如果您理解我的问题,请提出任何建议。

谢谢,

编辑:

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to  by  s.   Reading  stops
       after  an  EOF  or  a  newline.  If a newline is read, it is stored into the buffer.  A '\0' is stored after the last character in the
       buffer

因此缓冲区将包含:

"Low, Lisa" 35 F\0\r

如果它包含\ r \ n,它将从strlen返回17?我认为这是正确的吗?

4 个答案:

答案 0 :(得分:3)

缓冲区将包含:

"Low, Lisa" 35 F\n\0

所以-2是正确的:strlen - 0将是空终止符,-1是换行符,-2是字母F.

此外,

if(temp == NULL) {

temp是一个数组 - 它永远不会是NULL。

答案 1 :(得分:1)

这取决于用于保存文件的操作系统:

  • 对于Windows,回车符是\ r \ n
  • 对于Linux,它们是\ n

答案 2 :(得分:1)

您是否已经调试并找到Len的确切内容。如果你正在c中添加监视,并找出你的值len显示的内容。

答案 3 :(得分:1)

而不是

if (temp == NULL) 

检查来自fgets的返回值,如果它为null则表示失败

if ( fgets(temp, STRING_SIZE, fp) == NULL )

是的,strlen包含换行符

请注意,如果您位于文件的最后一行,并且在该行的末尾没有\ n,如果您认为字符串中始终有\ n,则会遇到问题。

另一种方法是像你一样读取字符串,但检查最后一个字符,如果没有\ n那么你不应该使用-2 offset而是-1。