繁体   English   中英

关于“C 中指针和整数之间的比较”的警告

[英]Warning about 'Comparison between pointer and integer in C'

我在 C 中使用文件处理来打开 CSV 文件,并且由于我使用的是 Windows 操作系统,因此 CSV 文件的换行符是 \\r\\n

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

但是当我编译代码时,我收到错误“警告:指针和整数之间的比较”。 那么有没有办法解决这个问题?

编辑:

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

上面的代码行已经去掉了警告,但是还是没有检测到换行符

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

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

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

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

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

§7.21.2 流

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

¶7.21.3 文件

¶2 ... 对文本流的写入是否会导致相关文件在该点之外被截断是实现定义的。

§7.21.9.2 fseek函数

¶4对于文本流,无论是offset应为零,或offset应是由早期的成功调用返回的值ftell上使用相同的文件相关的物流功能和whence应SEEK_SET。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM