【问题标题】:Warning about 'Comparison between pointer and integer in C'关于“C中指针和整数的比较”的警告
【发布时间】:2017-10-25 01:32:56
【问题描述】:

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

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

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

编辑:

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

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

【问题讨论】:

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

标签: c csv compiler-errors compiler-warnings


【解决方案1】:

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

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

【讨论】:

  • 这已经消除了警告,但程序仍然没有检测到换行符,这是主要目的
  • @user2891112 那么你可以这样做,使用 '\n' 来分割行,并且对于每一行,如果有的话,删除最后一个 '\r' 字符。 ;-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多