2015-08-13 91 views
0

我正在嘗試檢測我的明文的哪些行以「linePrefix」開始。使用上面的代碼,即使有巧合,strcmp永遠不會返回0.有誰知道我失敗的地方?獲取以前綴開頭的文件的行

const char PREFIX[] = {"linePrefix"}; 
    FILE *fp; 
    char *line = NULL; 
    char *aux = NULL; 
    aux = (char *) malloc(16); 
    size_t len = 0; 
    ssize_t read; 
    char path[] = {/*path*/}; 

    fp = fopen(path, "r"); 

    while ((read = getline(&line, &len, fp)) != -1) { 
    strncpy(aux, line, 15); 
    printf("strcmp: %i\n, strcmp(aux, PREFIX)); 
    } 
+0

[請不要投的malloc'的結果()'](http://stackoverflow.com/a/605858/3233393)。 – Quentin

回答

4

你忘了加上aux一個字符串結束:

strncpy(aux, line, 15); 
aux[15] = `\0`; 

注意,有做,你不需要複製字符串比較簡單的方法。只需用的line直接開始比較:

while ((read = getline(&line, &len, fp)) != -1) { 
    printf("strcmp: %i\n, strncmp(line, PREFIX, strlen(PREFIX))); 
} 
+0

好的建議,雖然不是'strlen(PREFIX)'使用'sizeof(PREFIX)-1'。 – Lundin

+0

@Lundin只要PREFIX被聲明爲一個數組,它就會工作。 –

+0

@KlasLindbäck任何它不會的原因?你也可以寫'sizeof(「linePrefix」) - 1',但這會使代碼變得醜陋。 – Lundin

0

最有可能的線長超過15個字符,在這種情況下,函數strncpy()休息。函數strncpy表現爲:

如果陣列s2指向到是一個字符串短於n個字符,空字符 被附加到陣列中的拷貝由s1指向的,直到在所有n個字符已經 寫的。

換句話說,如果沒有空間,strncpy將不會終止程序,導致它崩潰並燒燬。因此,避免使用strncpy(),這是程序員經常無法正確使用的危險函數。

更好的代碼:

size_t length = strlen(line); 

if(length > MAX_LENGTH) 
{ 
    length = MAX_LENGTH; 
} 

memcpy(aux, line, length); 
aux[length] = '\0'; 
相關問題