出现问题,返回正确的长度+ 2

时间:2018-11-15 12:33:13

标签: c strlen

我有一个奇怪的错误。

我写了一个获取文件并返回每行长度的函数:

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

有人知道错误在哪里吗?

2 个答案:

答案 0 :(得分:4)

别忘了fgets将换行符留在缓冲区中。

似乎您正在读取在Windows中创建的文件(其中换行符是两个字符"\r\n"),而换行符仅为"\n"。这两个字符也是字符串的一部分,将由strlen进行计数。


我猜您正在非Windows系统中读取Windows创建的文件的原因是,对于以文本模式(默认)打开的文件,则读取和写入字符串的函数将 translate < / em>与操作系统有关的格式之间的换行符。

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

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

答案 1 :(得分:0)

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

这是赠品

获得的输出

 line contains : AAAAA
size is : 7

预期产量

 line contains : AAAAA size is : 7