C - liest eine Zeile von der Standardeingabe mit fgets() in der Funktion
Ich versuche, liest eine Zeile von der Standardeingabe mit fgets(), will ich mit fgets() in meiner Funktion, die ich denke, dass ist das problem. Der string kann max 1024 chars lang. Wenn ich diesen code ausführen, ich erhalte die Meldung "Segmentation fault (core dumped)"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1025
void print_fgets();
int main()
{
print_select();
return 0;
}
void print_select()
{
char *str;
int length;
while (fgets( str, MAX_SIZE, stdin)!=NULL)
{
length=strlen(str);
if (length==MAX_SIZE-1 && str[length-1]!='\n')
{
printf("Error, line overeached buffer!\n");
return 1;
}
if (str[length-1]=='\n')
str[length-1]='\0';
printf("%s\n", str);
}
}
- wo werden Sie gehört?
- Sie wusste nicht, reservieren Sie Speicher für
str
. das ist, warum. - Wie reservieren Sie Speicher? Ich bin neu in C.
- siehe malloc () - Funktion (und deriviatives)
- Für ein fixed-size-buffer, die man in der Regel weist
s
mit automatischer oder globalen Speicher:char s[MAX_SIZE];
oderstatic char s[MAX_SIZE];
wenn mehrere threads sind nicht ein Problem. Ihre Länge überprüft, sind auch völlig unnötig.fgets
garantiert, dass Sie nicht den überlauf des Puffers. - Hinweis: In seltenen Fällen (Lesen von einer eingebetteten
'\0'
),str[0] == 0
, dannstr[length-1]
außerhalbstr
. Empfehlensize_t len = strlen(str); if (len > 0 && str[len-1] == '\n') str[--len] = '\0';
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie versuchen zu schreiben, an der Stelle, die die
str
- Zeiger.Anfangs wird es ein Müll-Adresse (wegen
char *str
nicht initialisiert werden).Können Sie versuchen, einen stack-basierten Lösung anstelle von ändern:
zu:
Oder wenn Sie möchten, reservieren Sie Speicher dynamisch für das array, tun Sie dies:
Vergessen Sie nicht Dinge wie array-Indizes beginnen mit
0
und geht zuMAX_SIZE - 1
(in deinem Fall) und NUL-termination (strings müssen mit ihm enden).fgets
auch garantiert NULL-Terminierung.fgets
genannt, das ist aber etwas anderes, dass keine Garantie für die null-Terminierung zum Beispiel.MAX_SIZE
statt hardcoded1025
.