我们假设我有一个文件
a
ab
abc
abcd
abcde
abcdef
abcdefg
abcdefgh
abcdefgh
abcdefg
abcdef
abcde
abcd
abc
ab
a
我需要找到length >= 5
行。
这是代码
int cOriginal(char *fileName)
{
FILE *file = fopen(fileName, "r");
char line[256];
int numberOfStrings = 0;
while(fgets(line, sizeof(line), file))
{
if (strlen(line) >= sizeCap)
{
numberOfStrings++;
}
}
fclose(file);
return numberOfStrings;
}
其中sizeCap
是常量,定义为
const int sizeCap = 5;
我的main()
功能
int main()
{
char filename[] = "file.txt";
int cnt3 = cOriginal(filename); // th
printf("Using function3: %d", cnt3);
return 0;
}
问题是它返回10
而不是8
。我不知道为什么。
我旁边没有IDE所以我必须使用g ++和命令行来编译它,所以我无法调试它(或者至少我不知道如何)。
有什么问题?
答案 0 :(得分:3)
这是因为fgets()
读取并存储了尾随换行符\n
。在计算strlen()
时,此\n
计为一个元素。
您需要在获取输入后剥离\n
。
手动方式
strlen()
。n-1
\n
的字节,替换为\0
。strlen
。使用库函数
使用strchr()
strchr()
查找尾随\n
。\n
替换为\0
。此外,您可以通过从原始输入字符串中减去返回的指针来获取新的字符串长度。
示例代码:
int length = 0;
char*nl=strchr(line,'\n');
if (nl)
{
*nl='\0';
length = nl - line;
}
else
length = strlen(line);
使用strtok()
strtok()
的{{3}}。阅读输入后,您可以使用\n
作为分隔符解析字符串。strlen()
,如果它不是NULL。一些建议:
fopen()
的返回值是否为NULL以确保成功。main()
的推荐签名为int main(void)
。