2012-01-05 80 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; 
}