2012-01-05 83 views
0

我正在搜索一个字符串,并且该字符串可能包含换行符或CRLF。我增加指针来搜索每个字符。我已将十六进制转换为十进制。然而,因为我正在寻找一个字符,我不确定这将是实现这一目标的最佳方式。搜索换行符或CR/LF字符

非常感谢您的任何建议,

/* 
     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编译。

回答

4

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行代码。)

+1

的检查'*(search + 1)!='\ 0''在内部if语句中是不必要的,当你检查是否是*(search + 1)=='\ n''。 – AusCBloke 2012-01-05 07:56:13

+0

@AsusCBloke:你完全正确 - 编辑。对于我的边界检查过于谨慎...... – Thanatos 2012-01-05 07:58:33

+0

''\ n''不仅更清晰,而且更准确 - 此代码现在可用于EBCDIC系统! (...也是碰巧为它们的行结尾使用CRLF ...) – 2012-01-05 07:59:16

2

查找strchrstrstr的功能。他们已经为此制造了。

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

1

你可以简单地修改代码以:

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?) */ 
    } 
} 

的短路在if声明将阻止(search + 1)被dereferenced如果*search'\r',所以如果*search结果为'0',那么这将不会导致您超出字符串的范围。

*search == 3338在以前的代码示例是不会工作,如果searchchar*/char[],由于单个char只能表示256个不同的值,并且是CRLF的2个字节(2个char多个)的序列。

1

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

也有两种方法strspn(),strcspn()可以帮助。

0

个人而言,我正在做这样的时间与测试存根我使用490 6

..mainly因为我只是得到使用模运算符: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; 
}