2014-12-25 2 views
2

Я получаю ошибку сегментации в точке вызова функции. пожалуйста, помогите с любой информацией. Я новичок в кодировании, поэтому помощь с чем-нибудь еще, что вы видите, будет так высоко оценена! Ошибка сегментации происходит в «основной» функции.Что не так с моим вызовом функции?

#include<stdio.h> 
#include<stdlib.h> 
#define MAX 100 

void write(); 
void read(); 

int main() 
{ 
    int x; 

    while(x!=2) 
    { 
     printf("Type 0 to go to write program, type 1 to go to read program, type 2 to end program\n"); 
     scanf("%d",x); 
     if(x==0) 
      write(); 
     if(x==1) 
      read(); 
    } 
    return 0; 
} 

void write() 
{ 
    FILE *finalptr; 
    char name[MAX],gift[MAX]; 
    int none; 

    if((finalptr=fopen("names.dat","w"))==NULL) 
    { 
     printf("File could not be opened\n"); 
    } 

    else 
    { 
     printf("Enter the gifter's name2gift.\n"); 
     printf("Enter EOF to end input.\n"); 
     printf("? "); 
     scanf("%s%d%s",name,none,gift); 

     while(!feof(stdin)) 
     { 
      fprintf(finalptr,"%s %s\n",name,gift); 
      printf("? "); 
      scanf("%s%d%s",name,none,gift); 
     } 
     fclose(finalptr); 
    } 
} 
+4

Как общий совет, научиться использовать отладчик. – Drop

+1

Другие общие рекомендации: не используйте имена функций, такие как 'read()' и 'write()', которые являются частью стандартной библиотеки. Также включите предупреждения компилятора и обратите внимание на полученные предупреждения - компилятор поможет вам исправить множество ошибок, если вы позволите. –

+0

имена функций «write» и «read» являются стандартными именами, определенными в stdio.h, поэтому (были ли они мне) я бы использовал несколько уникальных имен, таких как myWrite и myRead. – user3629249

ответ

2
scanf("%d",x); 

scanfd спецификатор преобразования требует аргумент типа int * но вы пропускании int. Измените этот звонок на scanf("%d", &x);

У вас такая же проблема и у вас другие звонки scanf.

3
scanf("%d",&x); 

Читайте на адрес переменной. Который &x нет x. Поскольку у вас есть %d как ваш первый аргумент вашего scanf(), второй параметр должен быть некоторой допустимой ячейкой памяти (int *), которой должно быть считано значение, и в вашем случае, поскольку x неинициализирован или x не указывает на какую-либо действительную память это приведет к сбою сегментации.

Fix все ваши scanf()'s

PS: Использование неинициализированных значений приведет к UB (Значение x не инициализирован, и он используется)

+0

Второй аргумент, переданный 'scanf', действительно является проблемой, но ваше описание ** крайне неточно **. Функция 'scanf' принимает' '% d" 'как первый аргумент и поэтому ожидает, что адрес переменной' int' будет вторым аргументом. OP передает (неинициализированное) значение 'x', которое' scanf' интерпретирует «как допустимый адрес памяти и пытается записать в него во время выполнения. Результат, как правило, является неопределенным поведением, потому что мы не знаем, что такое значение 'x', но поскольку это значение, скорее всего, не ** допустимый адрес памяти, результатом будет нарушение доступа к памяти. –

+0

@barakmanos Согласен! Обновлен мой ответ более подробно – Gopi

0
int main() 
{ 
int x;//Error here beacause you have to initialize x 
//Though you may not get any errors chances of wrong output 
while(x!=2) 
{ 
    printf("Type 0 to go to write program, type 1 to go to read program, type 2 to end program\n"); 
    scanf("%d",x);//scanf("%d",&x); 
    if(x==0) 
     write(); 
    if(x==1) 
     read(); 
} 
return 0; 
} 

это работает.

1

Вы объявили x, как целое, так в scanf вы должны поставить &: scanf("%d",&x);

Смежные вопросы