Ошибка сегментации при чтении из текстового файла в строку в C - PullRequest
0 голосов
/ 06 января 2012

Я немного новичок в программировании на C ... Я пытаюсь прочитать имя пользователя от пользователя, а другое от текстового файла ... первый работает, но при чтении из текстового файла и сохранении"user_name" это дает мне ошибку сегментации.что здесь не так?

char user_in[10];
char user_name[10];
scanf("%s",user_in);
FILE *users_file;
users_file=fopen("users.txt","r");
fscanf(users_file,"%s",user_name);// segmentation error 

(РЕДАКТИРОВАНИЕ): файл существует (я проверял его).первое содержимое - строка длиной 5 символов, за которой следует пробел;

Sarah Mary Sally 

Ответы [ 3 ]

1 голос
/ 06 января 2012

Вы должны убедиться, что вы не перезаписываете за пределы выделенного размера массива user_name.

Вы выделили user_name память из 10 символов, если ваш файл содержит больше памяти, выделенной дляuser_name тогда недостаточно места для хранения этого содержимого, и оно перезаписывает границы выделенной памяти, вызывая неопределенное поведение , которое вполне может привести к ошибке сегментации.

Кроме того, в вашей программе нет обработки ошибок.Например: Вы должны проверить, был ли успешным вызов fopen.
Короче говоря, всякий раз, когда вы используете стандартные функции библиотеки c, всегда проверяйте, была ли функция успешной или нет.

0 голосов
/ 06 января 2012

Вам лучше указать размер в scanf ()

scanf("%9s", user_in);

и

fscanf(users_file, "%9s", user_name);

В качестве длины вы указываете 9, поскольку последний, десятый символ имеет значениеноль для обозначения конца строки.

Также, как уже говорили другие, проверьте, что вы успешно открыли файл:

#include <errno.h>  /* errno */
#include <string.h> /* strerror() */


users_file = fopen("users.txt","r");
if(!users_file){
    fprintf(stderr, "couldn't open users.txt: %s\n", strerror(errno));
    return 1;
}
0 голосов
/ 06 января 2012

размер контента, который программа читает из файла, больше размера user_name. это приведет к переполнению буфера и нарушит стек функций.

...