【问题标题】:Search for a newline charactor or CR/LF characters搜索换行符或 CR/LF 字符
【发布时间】:2012-01-05 07:46:17
【问题描述】:

我正在搜索一个字符串,该字符串可能包含换行符或 CRLF。我增加指针以搜索每个字符。我已将十六进制转换为十进制。但是,由于我正在寻找单个字符,我不确定这是否是最好的方法。

非常感谢您的任何建议,

   /*
      0x0a (ASCII newline)
      0x0d (ASCII carriage return)
      CRLF (0x0d0a)
    */

    while(*search != '\0') {
        /* Seach for a newline */
        if(*search == 10) {
            printf("\nnewline Found\n");
        }

        /* Search for a CRLF */
        if(*search == 3338) {
            printf("\nCRLF Found\n");
        }

        search++;
    }

我在 C89 模式下使用 gcc 4.6.2 进行编译。

【问题讨论】:

标签: c


【解决方案1】:

CRLF 是两个字符:CR 和 LF。您需要将它们单独匹配,而不是像 3338 那样一起匹配(我想:你从哪里得到那个数字?)另外,使用字符常量:'\0''\n''\r',它会让你的代码更清晰。

/*
  0x0a (ASCII newline)
  0x0d (ASCII carriage return)
  CRLF (0x0d0a)
*/

while(*search != '\0') {
    /* Seach for a newline */
    if(*search == '\n') {
        printf("\nnewline Found\n");
        search++;
    }

    /* Search for a CR or a CRLF */
    if(*search == '\r') {
        // OK, we found a CR, is it followed by a LF?
        if(*(search + 1) == '\n') {
            // Yes, it is, thus, it is a CRLF
            printf("\nCRLF Found\n");
            search += 2; // Note the 2! CRLF is 2 characters!
        }
        else {
            // No, just a lonely CR, forever alone.
            printf("\nCarriage return found\n");
            search++;
        }
    }
}

正如另一张海报所暗示的,您还可以使用strchrstrstr 函数,并从中获取最小有效结果。 (这就像 3 行代码。)

【讨论】:

  • 检查 *(search + 1) != '\0' 在内部 if 语句中是不必要的,当您还要检查 *(search + 1) == '\n' 时。
  • @AsusCBloke:您说的完全正确——已编辑。我的边界检查太小心了……
  • '\n' 不仅更清晰,而且更正确 - 此代码现在可以在 EBCDIC 系统上运行! (......这也恰好使用 CRLF 作为他们的行尾......)
【解决方案2】:

查找strchrstrstr 函数。它们就是为此而生的。

但是 CRLF 不是一个字符,而是两个字符。要找到它,请搜索“\n”并检查前一个字符。

【讨论】:

    【解决方案3】:

    您可以简单地将代码修改为:

    for(; *search != '\0'; search++) {
        /* Seach for a newline */
        if(*search == '\n') {
            printf("\nnewline Found\n");
        }
        /* Search for a CRLF */
        else if(*search == '\r' && *(search + 1) == '\n') {
            printf("\nCRLF Found\n");
            search++; /* search will be incremented twice (bit hacky?) */
        }
    }
    

    如果*search 不是'\r',则if 语句中的短路将防止(search + 1) 被取消引用,因此如果*search 出现,则不会导致您越过字符串的边界成为'0'

    如果searchchar*/char[],则您之前的代码示例中的*search == 3338 将不起作用,因为单个 char 只能表示256 个不同的值并且 CRLF 是 2 个字节的序列 (2 chars)。

    【讨论】:

      【解决方案4】:

      我建议使用strstr() 使用strchr(),因为后者不是多字节字符保存(根据定义)。

      strspn()strcspn() 这两种方法也有帮助。

      【讨论】:

        【解决方案5】:

        就我个人而言,我正在使用我正在使用的测试存根暂时这样做~

        ..主要是因为我刚开始使用模运算符:D

        int count(char *s) {
            char *p = s; 
            int i = 0;         
            while (*p) { 
                if (*p == '\r' || *p == '\n') { 
                    i++;
                }
                p++; 
            }        
            if (i % 2 != 0) { 
                    fprintf(stderr, "%s", "\n\x1b[31mgooby pls?\x1b[0m\n");
                    dosomething;  
            }
            return i / 2; 
        }
        

        【讨论】:

          猜你喜欢
          • 2019-03-14
          • 2018-06-20
          • 2011-01-27
          • 2012-03-22
          • 1970-01-01
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多