2016-12-01 91 views
0

我想用C來寫一個函數,以在條目中的文件,如果文件擴展名是png返回1,JPG等分段錯誤嘗試獲取文件的擴展名用C

這是我寫的:

int estImage(struct dirent *fichier) 
{ 
    char nomFichier[256]; 
    strncpy (nomFichier, fichier->d_name, 255); 

    char *dot = strrchr(nomFichier, '.'); 

    char * listeExtensionImage[] = {".png", ".jpg", ".jpeg", ".bmp" }; 
    int len = sizeof(listeExtensionImage)/sizeof(listeExtensionImage[0]); 

    printf(dot); //Just to test 

    for (int i=0; i<len; i++) 
    { 
     if(!strcmp(listeExtensionImage[i], dot)) 
      return 1; 
     else 
      return 0; 
    } 
} 

如果我把進入的文件不是一個圖片(例如.c文件),然後將沒有問題返回0,和中的printf(點),將顯示「 。C」。

但是,如果我嘗試輸入圖片文件(.jpg或任何其他我列出的),我有消息分段錯誤(核心轉儲)。 然後,我意識到問題來自行:

if(!strcmp(listeExtensionImage[i], dot)) 

如果我刪除的指令,一切都在兩者之間,那麼我沒有錯誤了。

但我不明白爲什麼我有這個問題,因爲我有同樣的程序與之相似的測試,它的工作原理:

int estExecutable(struct dirent *fichier) 
{ 
    char nomFichier[256]; // Variable qui contiendra le nom du fichier 
    strncpy (nomFichier, fichier->d_name, 255); 
    const char *dot = strrchr(nomFichier, '.'); 
    if(strcmp(dot,".exe")==0) 
    { 
     printf(nomFichier); 
     return 1; 
    } 
    else 
     return 0; 
}  

這個函數做的工作,我看不出有什麼我的兩個功能之間的區別。有人能幫助我嗎?謝謝!

編輯:也試過這個版本,但得到了同樣的錯誤:

int estImage(struct dirent *fichier) 
{ 

    char nomFichier[256]; // Variable qui contiendra le nom du fichier 
    strncpy (nomFichier, fichier->d_name, 255); 
    char *dot = strrchr(nomFichier, '.'); 

    int retour=0; 

    if((!strcmp(dot,".jpg")) || (!strcmp(dot,".png")) || (!strcmp(dot,".jpeg")) || (!strcmp(dot,".bmp"))) 
     retour = 1; 

    return retour; 
} 
+0

評論不適合廣泛的討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/129508/discussion-on-question-by-alan-segmentation-fault-error-while-trying-to-get-file) 。 – deceze

回答

1

你想這樣的:

int estImage(struct dirent *fichier) 
{ 
    char nomFichier[256]; 
    strncpy (nomFichier, fichier->d_name, 255); 

    char *dot = strrchr(nomFichier, '.'); 

    if (dot == NULL) 
     return 0; // no extension => it's not an image 

    char * listeExtensionImage[] = {".png", ".jpg", ".jpeg", ".bmp" }; 
    int len = sizeof(listeExtensionImage)/sizeof(listeExtensionImage[0]); 

    printf(dot); //Just to test 

    for (int i=0; i<len; i++) 
    { 
     if (strcmp(listeExtensionImage[i], dot) == 0) 
      return 1; // image extension found 
    } 

    return 0; // no image extension found 
} 
+0

手動區分很困難。可能在30條評論中已經討論過,但如果有一個被接受的答案,它應該是獨立的。你爲什麼不給出解釋並突出差別? –

0

所以,這要歸功於瑪麗安,我們抓住了錯誤。函數estImage()在for循環中調用,應該列出目錄中的所有文件。該循環可能捕獲了一個不可見的文件或名稱爲空的文件,並且點變量爲NULL。所以,工作代碼是:

int estImage(struct dirent *fichier) 
{ 

    char nomFichier[256]; // Variable qui contiendra le nom du fichier 
    strncpy (nomFichier, fichier->d_name, 255); 

    char *dot = strrchr(nomFichier, '.'); 

    int retour=0; 


    if(dot!=NULL && ((!strcmp(dot,".jpg")) || (!strcmp(dot,".png")) || (!strcmp(dot,".jpeg")) || (!strcmp(dot,".bmp")))) //Si le fichier est une image 
     retour = 1; // On retourne 1 

    return retour; 


} 

非常感謝所有幫助過我的人!

+2

但是這個功能很糟糕。帶有'char * listeExtensionImage [] = {「.png」,「.jpg」,「.jpeg」,「.bmp」};'的原始版本更加優雅。不,沒有神祕感。如果你有一個沒有擴展名的文件(這很常見)'strchr(xxx,'。');''返回NULL。 –