Почему этот код вызывает ошибку сегментации? - PullRequest
0 голосов
/ 31 июля 2009
#include<stdio.h>


void main()
{
FILE  *fp,*fp1;
char c;
fp=fopen("test.txt","r");
fp1=fopen("test1.txt","w");
c=getc(fp);
while(c!=EOF)
{
    if (c=="")
    {
        c=getc(fp);
        continue;
    }
    else 
        fprintf(fp1,"%s",c);
    c=getc(fp);
}
fclose(fp);
fclose(fp1);

}

Ответы [ 5 ]

10 голосов
/ 31 июля 2009

Поскольку символ не является строкой.

Попробуйте fputc.

Кстати: c должно быть int, иначе вы не сможете обнаружить EOF. EOF> 255.

6 голосов
/ 31 июля 2009

В коде есть ряд проблем, которые могут вызвать проблемы.

fp и fp1 должны быть проверены на NULL после присвоения результата fopen для проверки ошибок открытия файла.

Тип c должен быть int, чтобы вы могли правильно отличить EOF от правильно прочитанного действительного символа.

c == "" пытается сравнить символьное значение с адресом буквенной строки нулевой длины.

fprintf(fp1,"%s",c) интерпретирует это символьное значение c как адрес постоянной строки и пытается следовать по этому адресу для печати строки. Это наиболее вероятная ошибка, вызывающая ошибку сегментации.


Менее важные вопросы стиля.

Возвращаемое значение main должно быть int. Это правильно, даже если многие реализации допускают void main(void).

Поскольку тело вашего предложения if совпадает с тем, что произойдет, если цикл завершится и за ним будет следовать continue, возможно, было бы яснее удалить это предложение и применить оператор if с противоположным из того, что вы думаете c=="" должно стать тем, что в настоящее время является else заявлением.

5 голосов
/ 31 июля 2009

c=="" также не будет работать так, как вы думаете.

3 голосов
/ 31 июля 2009

Ваша проблема - fprintf ("% s") переменной c. с не строка, это один символ. Замените эту строку на

fprintf(fp1,"%c",c);

И это будет работать. Существуют лучшие способы фактически скопировать содержимое одного файла в другой.

0 голосов
/ 31 июля 2009

Код дает ошибку сегментации из-за недопустимого доступа к памяти, fprintf ищет нулевой символ для завершения и в этом процессе получает доступ к неверному расположению памяти.
Также файловые указатели должны проверяться на нулевое значение, и код должен корректно завершаться, если любой из них является нулевым, в противном случае это также приведет к segfault.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...