fprintf "segmentation fault" - erklären, wie ich bin 5
Ich versuche zu schreiben, einige strings in eine Datei. Dies kompiliert ohne warnings, aber wenn ich das eine.es segfaults. Es tut erstellen der Ziel-Datei, jedoch. Ich bin sehr neu in C, so dass ich entschuldige mich für meine Formatierung und andere Mängel. Hier ist mein code:
#include<stdio.h>
int main (void)
{
FILE *fp_out;
char str1[]="four score and seven years ago our";
char str2[]="fathers broughy forth on this continent,";
char str3[]="a new nation, concieved in Liberty and dedicated";
char str4[]="to the proposition that all men are created equal.";
fp_out=fopen("my_file", "w");
if(fp_out!=NULL)
{
fprintf(fp_out,"%s\n", str1[100]);
fprintf(fp_out,"%s\n", str2[100]);
fprintf(fp_out,"%s\n", str3[100]);
fprintf(fp_out,"%s\n", str4[100]);
fclose(fp_out);
}
else
printf("The file \"my_file\" couldn't be opened\n");
return 0;
}
str1[100]
? KEINE der Saiten irgendwo in der Nähe von 100 Zeichen lang sind, so sind Sie acessing Speicher, die noch nicht vergeben ist. es soll;dfprintf(fp_out, "%s\n", str1)
- es gibt keine
strX[100]
- So, ich sollte die genaue Länge der Zeichenfolge, gibt es?
- Der Formatbezeichner
%s
erwartet eine string-variable oder ein Zeiger auf ein Zeichen. Sie übergeben ein einzelnes Zeichenstr1[100]
zum Beispiel, das ist keine gültige Adresse. Sie wollen passstr1
. - Auch: du bist die übergabe eines
char
wofprintf
erwartet einechar *
. I. e. ändern Sie es zustrX
ohne das array-subskript ([100]
) - Nein, ein Zeiger auf den Anfang der Zeichenkette. Die Saiten sind nul (Zeichen 0) beendet, es wird also ausrechnen, wie lange sind Sie selbst.
- Wenn Sie lernen, C, verwenden Sie ein C-Buch oder tutorial? Es ist eine viel schnellere Weg, um zu lernen, als nur raten. 🙂
- Danke für die Klarstellungen, ich habe es funktioniert und jetzt weiß ich ein bisschen mehr über strings :B
- Ich bin dabei, ein Intro zu C-Klasse im college, aber ich schlief in der Klasse, während einige der Zeichenfolgen Vorträge.
- 5-jährige wird nicht erlaubt, auf StackExchange-Netzwerk.
- haha ja, es kann ein wenig trocken.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie Lesen Sie die Anleitung auf
fprintf()
.In der format-Zeichenfolge, die Sie verwenden
%s
, das bedeutet, dass Sie gehen, um passfprintf()
eine Zeichenfolge von Zeichen.Dies ist ein string von Zeichen:
Dies ist, wie Sie drucken Sie eine Zeichenfolge von Zeichen:
Was Sie hier versuchen:
ist, drucken Sie die 101st "Zeichen" von
str1
, es ist nicht annähernd so lange, so versuchst du auf den Speicher zugreifen und weit darüber hinaus, was das array besitzt... nicht zu erwähnen, dass Sie vorbei sind ein Zeichen für eine format-string erwartet einen string daraus in UB.Sie einfach übergeben Sie einen Zeiger auf das array
In Ihrem code, 'str1[100]' bedeutet und hol mir die 100 Zeichen aus str1. Das wird ein einzelnes Zeichen im Bereich 0 bis 255. Ihr format-string '%s' was bedeutet 'ich werde übergeben Sie einen Zeiger auf eine Zeichenkette'. Sie übergeben ein Zeichen (das ist nur eine Zahl richtig), so dass Sie effektiv gab einen Zeiger <255 - das ist eine illegale Adresse, damit die seg-fault.
In den korrekten code 'str1' ist ein Zeiger auf einen string und so funktioniert. In deinem Beispiel str1 nicht überall in der Nähe von 100 Zeichen und damit das Ergebnis kann alles mögliche sein (einschließlich zusätzlicher seg fault).
Denken Sie daran: C ziemlich oft (und printf im besonderen) kümmert sich nicht, was Sie übergeben haben. Wenn Sie falsch sind... ärger.
oh...und... wenn ich sage, 100stel, Sie sind nummeriert von 0 (so ist es wirklich 101st)
Haben Sie keine Zeichen an
str1[100]
. Verwenden Sie Zeichen-Zeiger, der zeigt auf eine null-terminierte Zeichenfolge.und
Einem segmentation fault ist ein Fehler generiert, wenn Sie versuchen, Zugriff auf den Speicher, dass Sie nicht über die Berechtigung zum Zugriff. In Ihrem code, den Sie übergeben, str1[100], um printf mit %s Planer. Die %s-Bezeichner erwartet ein "char*" (character pointer). str1[100], ist im wesentlichen Müll, da es außerhalb der Zeichenfolge, die Sie deklariert. Zugriff auf str1[100] wahrscheinlich nicht erzeugen die segmentation fault, obwohl es könnte, je nachdem, wo in dem Stapel, die bis Ende zeigt. Aber printf nimmt Müll, den Sie ihm gegeben haben, und versucht, Sie zu dereferenzieren es als ein Zeichen-pointer, die Ergebnisse in der "segmentation fault". Der korrigierte code ist unten.