ibilalkayy Ответов: 4

Как удалить ошибку сегментации при замене текста в файле?


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 15
#define MAX_LEN 256
#define MAX_SIZE 32

void hello(){
	/* Declaring variables */
	int option, i=0, one_by_one=0, dob[11], id[13], phone_num[12], amount[1000000], fixing[13];

	char file_text[100], str[100], word[MAX_LEN], updated_name[50], jao[100], read[100], name[15] = "", address[30] = "", account[10] = "";
	short int FLAG = 0;

    static const char * listing[] = {"Name", "Date of birth","ID card number","Phone number","Address","Account","Fixing year","Deposit amount"};

    FILE * fr2 = fopen("file.txt","r");
    FILE * fr3 = fopen("file.txt","r");
    FILE * fw1 = fopen("new.txt","w");

	int c = fgetc(fr2);
	while(c != EOF){
		file_text[one_by_one] = c;
		if(file_text[one_by_one] == ' '){
			file_text[one_by_one] = '\0';
			printf("Here is your %s: %s\n",listing[i],file_text);
			one_by_one = 0;
			i++;
		}
		else
		   one_by_one++;
		c = fgetc(fr2);
	}
	fclose(fr2);

	/* Choice of different options to change */
	if (fr3 == NULL || fw1 == NULL) {
	    perror("Unable to read text file.");
	    exit(0);
	}

    for (option = 1; option <= sizeof(listing)/sizeof(char *); ++option)
	   printf("%d. Your %s\n", option, listing[option-1]);  

	/* Here the choice is Old Word */
	fputs("Select your choice to update: ", stdout);

	if ((scanf("%d", &option) != 1) || (option < 1) || (option > sizeof(listing)/sizeof(char *))) {
	  puts("invalid choice");
	  fclose(fr3);
	  exit(0);
	}
	/* Here is the New Word to replace with */
	printf("Enter new name to update: ");
	fgets(updated_name, sizeof updated_name, stdin);

	rewind(fr3); 
	while (!feof(fr3)) { 
		fscanf(fr3, "%s", read); 

		if (strcmp(read, jao) == 0) { 
			// for deleting the word 
			strcpy(read, updated_name); 
		} 
		// In last loop it runs twice 
		fprintf(fw1, "%s ", read); 
	} 
		fclose(fw1);
	fclose(fr2);
	  fclose(fr3);
}

int main(){
  hello();
}


Что я уже пробовал:

Here is a huge code. You can copy and paste also but it is giving me segmentation error. How to avoide this? Because whenever I try to replace the text and update it in another file, it gives me segmentation error. As I am new here. So I am pretty confused how to solve this issue and replace the word properly.

4 Ответов

Рейтинг:
2

Patrice T

Цитата:
Вот огромный код. Вы также можете копировать и вставлять, но это дает мне ошибку сегментации.

Независимо от того, что именно неправильно, сообщение означает, что где-то в вашей программе вы пытаетесь читать или писать в месте, которое вам не принадлежит.
Проблема заключается в том, что мы не можем запустить ваш код без файла данных, поэтому угадать, что пошло не так, просто прочитав код, очень трудно.
Существует инструмент, который может помочь вам понять, что происходит и почему, это отладчик, потому что он точно показывает вам, что делает код и как он это делает.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
1

Greg Utas

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


Рейтинг:
1

CPallini

Вы пропускаете элементарные проверки границ массива. Например, в следующем коде

Цитата:
while(c != EOF){
file_text[one_by_one] = с;
если(file_text[one_by_one] == ' '){
file_text[one_by_one] = '\0';
printf("вот ваш %s: %s\n",листинг[i],file_text);
one_by_one = 0;
я++;
}
еще
по одиночке++;
c = fgetc(fr2);
}

если one_by_one > 99 тогда у вас будут неприятности. Как и предлагалось, используйте отладчик, чтобы найти фактический источник боли, но, в любом случае, сделайте свой код более надежным.


Рейтинг:
0

Richard MacCutchan

int option, i=0, one_by_one=0, dob[11], id[13], phone_num[12], amount[1000000], fixing[13];

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


Greg Utas

5. Вы более наблюдательны, чем я, который не заметил, что они находятся в функции "Привет"!

Это, безусловно, вызовет его, и у любого, кто делает это, вероятно, есть много других ошибок тоже.

Richard MacCutchan

На самом деле я жульничал; я скопировал код и попытался его построить. Но, учитывая все остальное, я довольно быстро потерял интерес.