【问题标题】:C if statement failing to detect new lineC if 语句未能检测到新行
【发布时间】:2016-08-31 00:03:28
【问题描述】:

我正在使用 PPM 格式的幻数 P3 http://netpbm.sourceforge.net/doc/ppm.html

我有一个很长的 unsigned char 字符空格和换行符。例如,当我将其打印出来时,它会像这样很好地打印出来...

01 30 03 19 02 39 01 91 39 81 45 92 40 29 10 93
02 91 29 04 19 02 19 04 19 03 94 10 92 03 01 19 02
10 02 93 04

等等。 您会看到有些行比其他行长。这个巨大的字符串是从一个文件中读入的,并放入一个 unsigned char * 中。我的问题是,当我去更改值时,说每隔 2 个字符更改一次,例如...

01 becomes 00   //changing the LSB 
30 becomes 31

我在执行此操作时遇到了问题。当我到达行尾时,问题就出现了。我的 if 语句没有检测到行尾标记,因此当它去抓取下一个值时,它不会抓取第二个数字,而是抓取第一个数字。

我检测行尾的 if 语句不起作用...

if(num[count] == '\n' || num[count] == '\0' || num[count] == '\r' || num[count]== '\t')
{
     count = count + 2;
}

这个 if 语句的目标是检测新行和进度计数 2,所以我摆弄的下一个值将是下一行从 02 开始的 2。我不完全确定为什么我无法检测到行尾标记,因为如果我打印出 unsigned char * 它以上述方式打印新行时肯定会有一些东西。

【问题讨论】:

  • 您的换行符使用 2 个字节。
  • 所以我应该检测'\'?
  • 不行,你需要在 CR 之后直接检测 LF。
  • 如果 CR 是 \ 或十六进制数 0x0D,当它可能是 0x0A(可能是 char 值)时,我如何检测它后面的 LF?
  • 你前进一个字符然后检查。

标签: c return newline


【解决方案1】:

如果您的变量num 的类型为unsigned char *,那么您的count 变量中的每个增量对应于一个八位字节(即一个字节)的增量。一个八位字节对应于两个十六进制值。因此,您在输入开头的01 代表一个八位字节。 0 代表四个最高有效位,1 代表四个最低有效位。

因此,当您将 count 增加 2 时,我假设您也在 if 语句之外执行此操作,您实际上是在跳过所有其他字符。

如上所述,误解是您看到打印出来的每个十六进制值对应的不是一个字节,而是一个字节内的 4 位。您将要执行的过程描述为“更改 LSB”。但是您给出的示例实际上是更改最低有效四位,而不是最低有效字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多