strlen问题,returns正确的长度+2

strlen problems, returns the right length + 2

我有一个奇怪的错误。

我写了一个函数获取一个文件和returns每一行的长度:

void readFile1(char *argv[], int fileNumber,
          char *array_of_lines[NUMBER_OF_LINES+1], int *currNumOfLines)
{
    FILE* fp;
    fp = fopen(argv[fileNumber], "r");
    if (fp == NULL)
    {
        fprintf(stderr, MSG_ERROR_OPEN_FILE, argv[fileNumber]);
        exit(EXIT_FAILURE);
    }
    char line[256];
    while (fgets(line, sizeof(line), fp))
    {
        printf("\n line contains : %s size is : %lu\n",line,strlen(line));
    }
}

该函数总是打印 正确的数字 + 2, 例如,如果 file.txt 仅包含一行 "AAAAA",该函数将打印长度为 7 而不是 5

 line contains : AAAAA
 size is : 7

有人知道错误在哪里吗?

不要忘记 fgets 将换行符留在缓冲区中。

您似乎正在读取一个在 Windows 中创建的文件(其中换行符是 两个 字符 "\r\n")在换行符是只有 "\n"。这两个字符也是字符串的一部分,将按 strlen.

计数

我猜你是在非Windows系统中读取一个Windows创建的文件的原因是,对于以文本模式(默认)打开的文件,函数读取和写入字符串将 转换 操作系统相关格式的换行符。

例如在 Windows 上,当写明文 "\n" 时,它会被翻译并实际写成 "\r\n"。阅读时会发生相反的翻译("\r\n" 变为 "\n")。

在具有普通 "\n" 行结尾的系统(如 Linux 或 macOS)上,不需要翻译,并且 "\r" 部分将被视为任何其他字符。

printf("\n line contains : %s size is : %lu\n",line,strlen(line));

这里有赠品

获得输出

 line contains : AAAAA
size is : 7

预期输出

 line contains : AAAAA size is : 7