2016-10-05 5 views
1

Ich versuche, das Programm, das Dateinamen extrahieren, indem Sie einige Ordnerpfad eingeben.Segmentierung Fehler von Zeiger und char

Das Ergebnis ist gut, aber das Problem ist am Ende des Ergebnisses, es gibt einige Segmentierung Fehler, die ich nicht herausfinden kann.

Hier ist, was ich schrieb.

#include <stdio.h> 
#include <dirent.h> 

int main() { 

char folderpath; 
printf("enter the path : \n"); 
scanf("%s",&folderpath); 



DIR *d; 
struct dirent *dir; 
d = opendir(&folderpath); 
if (d) 
{ 
    while((dir= readdir(d)) != NULL) 
    { 
     printf("%s\n", dir->d_name); 
    } 
    closedir(d); 

}; 

return 0; 
} 

Und Ergebnis ist wie

enter the path : /Users/gui/Desktop/extract/extract 
. 
.. 
main 
main.c 
Segmentation fault: 11 

Es tut uns wie diese wirklich einfache Frage, die ich sehr versucht, herauszufinden, aber ich kann nicht.

Vielen Dank für das Lesen dieser Frage. Bester Respekt.

+0

führen Sie es unter einem Debugger, wird es Ihnen zeigen, welche Zeile schlägt fehl – pm100

+0

Ordnerpfad reserviert nur ein einzelnes Zeichen des Raumes, und Sie versuchen, die ganze Zeichenfolge hinein zu lesen. Ändern Sie die Definition in 'char folderpath [100];' oder etwas mit ausreichend Platz. Dann loswerden der '&' in der scanf. – bruceg

+0

danke euch allen !! Ich habe wirklich nicht erwartet, dass so viele Leute mir helfen würden. Ich verspreche, ich werde jemandem helfen, der ein Problem der Programmierung hatte !! Danke !! –

Antwort

0

Wenn Sie scanf mit dem Formatbezeichner %s aufrufen, erwartet es einen Zeiger auf ein Array von Zeichen. Was du passierst, ist die Adresse eines einzelnen Charakters. Es schreibt also über den Speicherort dieser Variablen hinaus in das, was daneben passiert. Dies ruft undefined behavior auf.

Sie benötigen ein Zeichenfeld zu scanf passieren:

char folderpath[256]; 
printf("enter the path : \n"); 
scanf("%s",folderpath); 

... 

d = opendir(folderpath); 
+0

danke für deine freundliche erklärung. schätze es wirklich! jetzt kann ich jemandem helfen, der ein ähnliches Problem mit mir hatte !! Danke !! –

0

Sie diesen

nicht tun kann
char folderpath; 
printf("enter the path : \n"); 
scanf("%s",&folderpath); 

Sie haben für ein Zeichen reservierten Platz. Sie brauchen

char folderpath[MAX_PATH]; 
printf("enter the path : \n"); 
scanf("%s",&folderpath); 
+0

danke! aber ich frage mich, MAX_PATH könnte den langen Ordnerpfad nehmen. –

0

Wenn Sie char fotrrpath deklarieren, wird nur ein Byte Speicher zugewiesen, das Sie nur ein Zeichen speichern können. Wenn Sie versuchen, mehr als ein Byte zu speichern, führt dies zu einem Segmentierungsfehler (Zugriff des Speicherorts außerhalb Ihres Prozessraums in diesem Fall). Also versuchen Sie ein Array wie char Ordnerpfad [MAXFOLDERLENGTH] sonst können Sie den zusammenhängenden Block von Bytes durch den Aufruf malloc wie char foldrpath = (char) malloc (MAXFOLDERLENGTH), diese malloc weist den Speicher im Heap-Bereich, wo die Die frühere Deklaration gibt Ihnen im Stapelbereich zugewiesenen Speicher. Hoffe, das hilft

+0

danke !! Ich weiß nicht genau über den Unterschied mit Heap-Bereich und Stack-Bereich in diesem Moment, aber ich werde es suchen! Danke !! –