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?我认为这是正确的吗?
答案 0 :(得分:3)
缓冲区将包含:
"Low, Lisa" 35 F\n\0
所以-2是正确的:strlen - 0将是空终止符,-1是换行符,-2是字母F.
此外,
if(temp == NULL) {
temp是一个数组 - 它永远不会是NULL。
答案 1 :(得分:1)
这取决于用于保存文件的操作系统:
答案 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。