我正在搜索字符串,字符串可能包含换行符或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进行编译。
答案 0 :(得分:4)
CRLF是两个字符:CR和LF。您需要单独匹配它们,而不是像3338
一样匹配它们(我想:你从哪里获得这个数字?)另外,使用字符常量:'\0'
,{{1} },'\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++;
}
}
}
和strchr
函数,并从中获取最小的有效结果。 (这将是3行代码。)
答案 1 :(得分:2)
查找strchr
和strstr
函数。他们是为此而做的。
但是CRLF不是一个字符,而是两个字符。要找到它,请搜索'\ n'并检查前一个字符。
答案 2 :(得分: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)
,*search
语句中的短路会阻止'\r'
被取消引用,这样就不会导致您超越*search
的范围如果'0'
原来是*search == 3338
,则为字符串。
search
是char*
/ char[]
,则前一代码示例中的 char
无效,因为单 { {1}}只能表示256个不同的值,CRLF是2个字节的序列(2 char
s)。
答案 3 :(得分:1)
我建议使用strstr()
和不来使用strchr()
,因为后者不是多字节字符保存(根据定义)。
另外,strspn()
,strcspn()
这两种方法可以提供帮助。