警告' C'中指针和整数之间的比较

时间:2017-10-25 01:32:56

标签: c csv compiler-errors compiler-warnings

我在C中使用文件处理来打开CSV文件,因为我使用的是Windows操作系统,所以CSV文件的换行符是\ r \ n

    if( buffer[i] == "\r\n")
    {
        printf("New line encountered");        
    }

但是当我编译代码时,我收到错误"警告:指针和整数之间的比较"。那有什么方法可以解决这个问题吗?

修改

    if (buffer[i]=='\r' && buffer[i+1]=='\n')

上面的代码行已删除警告,但仍未检测到换行符

3 个答案:

答案 0 :(得分:1)

buffer [i]是一个字符,“\ r \ n”是一个字符串,你无法比较它们。如果这样做,该字符将转换为整数,并显示您看到的警告。

您可以使用'\r' == buffer[i] && '\n' == buffer[i + 1]来比较它们,并注意索引边缘。

答案 1 :(得分:0)

您正在将单个字符(buffer[i])与指向字符数组(char* = "\r\n")的指针进行比较。在这种情况下,您必须单独检查\r\n。一个简单的状态机就足够了(检查char是\ r \ n还是\ n,如果找到\ n,则最后一个字符不是\ r \ n)

答案 2 :(得分:0)

在Windows上,如果您将文件作为文本文件而不是二进制文件打开(即使用fopen(filename, "r")而不是fopen(filename, "rb"),则需要C运行时映射本机行结束于Unix风格的\n行结尾。如果以二进制模式打开文件,则不会发生此映射。

因此,您没有看到CR('\r')字符,因为运行时已将其删除。这就是为什么在C标准中描述文本流有如此多的措辞谨慎的例外情况。该标准允许'\r' - 仅限行结尾('\r'映射到'\n');它允许固定长度的记录(删除尾随空格;插入换行符);它允许CRLF行结尾(字符对映射到'\n');它允许NL(aka LF)行结尾(不需要映射)。

  

§7.21.2流

     

¶2文本流是由组成的有序字符序列,每行由零个或多个字符加上一个终止的换行符组成。最后一行是否需要终止换行符是实现定义的。可能必须在输入和输出上添加,更改或删除字符,以符合在主机环境中表示文本的不同约定。因此,流中的字符与外部表示中的字符之间不需要一一对应。从文本流读入的数据必须与之前写入该流的数据相等,只有在以下情况下:数据仅包含打印字符,控制字符包含水平制表符和新行;空格字符前面不会有任何换行符;最后一个字符是换行符。在读入时是否出现在换行符之前立即写出的空格字符是实现定义的。

     

¶7.21.3文件

     

¶2...文本流上的写入是否导致关联文件被截断超出该点是实现定义的。

     

§7.21.9.2fseek函数

     

¶4对于文本流,offset应为零,或者offset应为先前成功调用与ftell函数关联的流上的whence函数返回的值。同一个文件和{{1}}应为SEEK_SET。