Segmentation fault in c when reading a line -
i want read user input(like terminal) until exit written or ctrl+c/ctrl+d pressed. read every line(until return/enter pressed), check if it's space or comment(#) , execute functions.
i tried 3 methods, no success. error every time insert string , press enter
char line[256]; while(printf("%s>", shell_name) && scanf("%50[^\n]", line) != eof) { segmentation fault (core dumped)
while(printf("%s>", shell_name) && getline(line, 100, stdin) != eof) note: expected ‘size_t * restrict’ argument of type ‘int’
while(printf("%s>", shell_name) && fgets(line, sizeof(line), stdin) != null) { segmentation fault (core dumped)
for more orientation i'm doing next
if(isspace(&line) == 0 && &line[0] != "#") what doing wrong? there more suitable/easy/better option?
the segfault kicks in because enter infinite loop: scanf("%50[^\n]", line) reads input , stops @ return. return not consumed , stays in input buffer. happens next time around? scanf checks input buffer, , hey! there return! stops reading. et cetera.
adding space first character inside scanf format string resolves that:
int main() { char line[256]; char *shell_name = "mysh"; while (printf("%s>", shell_name) && scanf(" %50[^\n]", line) != eof) { printf ("you entered [%s]\n", line); } printf ("done.\n"); return 0; } on further note, wrong:
if(isspace(&line) == 0 && &line[0] != "#") -- gcc complains
warning: passing argument 1 of 'isspace' makes integer pointer without cast warning: comparison string literal results in unspecified behavior the first on isspace(&line), meant isspace(line[0]), second on &line[0] != "#", can written more concisely line[0] != '#'.
on getline
getline works different other "get stdin" functions, because automatically allocate memory if asked to. since needs return not one, three results (the number of characters, string entered, , length) need provide pointers string , size arguments:
size_t line_size = 0; char *ptr_to_line = null; while (printf("%s>", shell_name) && getline(&ptr_to_line, &line_size, stdin) != -1) ... when using way, should not use static string size allocation, function fill in appropriate values. (but don't forget uses malloc , realloc internally, make sure free result. uses malloc first time, realloc after resize.)
Comments
Post a Comment