LINUX.ORG.RU

Segmentation fault на while ( c[i] != '\n' )

 , , ,


0

1

Добрый день. Я не очень опытный программер, но есть такой код:

void readstring(char c[11], FILE *infile)
	int i = 0;
	while ( c[i] != '\n' )
	{
		c[i] = fgetc(infile);
		i++;
	}
}

Выскакивает Segmentation Fault. Проверил gdb - SIGSEGV выскакивает на

	while ( c[i] != '\n' )

почему этот код не работает?



Последнее исправление: ilya08 (всего исправлений: 2)
Ответ на: комментарий от PolarFox

ух ты, спасибо, я не писал проверку, потомучто выход за границу

не мог быть, т.е в строке всего лишь 3 символа было

ilya08
() автор топика
Ответ на: комментарий от ilya08

Так же вы сначала проверяете значение, а потом считываете его из файла. Уверены, что так должно быть?

Dmitri_Ezhov
()
Ответ на: комментарий от ilya08

Лучше не изобретать велосипед. Но, если ты настаиваешь:

#include <stdio.h>

void
readstring(char *c, FILE *fd, size_t sz)
{
        do 
                *c = fgetc(fd);
        while (*c++ != '\n' && --sz > 0);

        *--c = '\0';
}

int
main()
{
        char str[11];

        readstring(str, stdin, sizeof(str));

        printf("%s\n", str);

        return 0;
}
beastie ★★★★★
()
Ответ на: комментарий от marvin_yorke

ну ладно буду писать велосипед

ilya08
() автор топика
Ответ на: комментарий от ilya08

apt-get install libbsd-dev

Там ещё много и других вкусных и полезных функций.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie
$ man fgetln
No manual entry for fgetln

$ man -P head fgets
GETS(3)                    Linux Programmer's Manual                   GETS(3)



NAME
       fgetc,  fgets,  getc,  getchar,  gets, ungetc - input of characters and
       strings

SYNOPSIS
       #include <stdio.h>
anonymous
()
void readstring(char c[11], FILE *infile)

Из-за чего сегфолт, уже ответили выше. Смысла передавать размер массива в аргументе нету никакого. В си обычно делается так:

void f(char *arr, size_t size) {
  /* my amazing code */
}
DELIRIUM ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.