查找长度大于5的行数

时间:2015-05-05 08:32:11

标签: c string fgets

我们假设我有一个文件

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 ++和命令行来编译它,所以我无法调试它(或者至少我不知道如何)。

有什么问题?

1 个答案:

答案 0 :(得分:3)

这是因为fgets()读取并存储了尾随换行符\n。在计算strlen()时,此\n计为一个元素

您需要在获取输入后剥离\n

  • 手动方式

    1. 检查strlen()
    2. 检查n-1 \n的字节,替换为\0
    3. 计算最终(实际)strlen
  • 使用库函数

使用strchr()

  1. 您需要使用strchr()查找尾随\n
  2. 如果找到,请使用重新调整的指针将\n替换为\0
  3. 此外,您可以通过从原始输入字符串中减去返回的指针来获取新的字符串长度。

    示例代码:

    int length = 0;
    char*nl=strchr(line,'\n'); 
    if (nl) 
    {
        *nl='\0';
        length =  nl - line;
    }
    else
        length = strlen(line);
    
  4. 使用strtok()

    1. 查看strtok()的{​​{3}}。阅读输入后,您可以使用\n作为分隔符解析字符串。
    2. 计算返回令牌的strlen(),如果它不是NULL。
    3. 一些建议:

      1. 始终检查fopen()的返回值是否为NULL以确保成功。
      2. main()的推荐签名为int main(void)