2011-07-30 4 views
0

Я пытаюсь сделать простую программу текстового редактора на C, но у меня есть эта странная ошибка. Когда я дойду до первой пользовательской подсказки, программа выйдет из строя. Вот мой код:Ошибка в текстовом редакторе Программа

#include <stdio.h> 

int main() 
{ 
FILE *filenew; 
char firstchoice[200]; 
char filenamenew[200]; 
char overwrite; 
char *textwrite; 
char *filenameopen; 
FILE *fileopen; 
char readchar; 
char *textopen; 

    start: 
puts("Welcome to the Texter Text Editor!"); 
printf("\n"); 
printf("\n"); 
puts("Type ~N~ to create a new document,"); 
puts("Type ~O~ to open an existing document,"); 
puts("And type ~Q~ to quit."); 
scanf("%s",&firstchoice); 
if(firstchoice=="~N~" || firstchoice=="~n~") 
{ 
    puts("Enter the filename of the new document:"); 
    scanf("%s",&filenamenew); 
    filenew = fopen(filenamenew,"r"); 
    if(filenew) 
    { 
     fclose(filenew); 
     printf("%s already exists!\nDo you wish to overwrite it? [Y/N]",filenamenew); 
     overwrite=getchar(); 
     if(overwrite=='y' || overwrite=='Y') 
     { 
      filenew=fopen(filenamenew,"w"); 
      goto textnew; 
     } 
     else if(overwrite=='N' || overwrite=='n') 
     { 
      goto start; 
     } 
    } 

textnew: 
    if(!filenew) 
    { 
    do 
    { 
     scanf("%s",textwrite); 
     fprintf(filenew,"%s",textwrite); 

    } 
    while(textwrite!="~Q~" && textwrite!="~q~"); 
    } 

} 
else if(firstchoice=="~q~" || firstchoice=="~Q~") 
{ 
    return(0); 
} 
else if (firstchoice=="~o~" || firstchoice=="~O~") 
{ 
    printf("Enter the filename of the document you want to open:\n"); 
     scanf("%s",filenameopen); 
    fileopen=fopen(filenameopen,"r+"); 
    if(!fileopen) 
    { 
     puts("File does not exist!"); 
     goto start; 
    } 
    else 
    { 
     do 
     { 
     readchar=getc(fileopen); 
     putchar(readchar); 
     } 
     while(readchar!=EOF); 
     do 
     { 
      scanf("%s",textopen); 
      fprintf(fileopen,"%s",textopen); 
     }while(textopen!="~Q~" && textopen!="~q~"); 
    } 



} 
return(0); 
} 

Я знаю, что это грязно, со всеми GOTOS и переключение с массив символов на символ указателя, но, пожалуйста, попробуйте помочь.

+1

не торопитесь и попробуйте переформатировать и перестроить код. не для нас, а для себя. если окупается. – fazo

ответ

1
char *textwrite;  
... 
scanf("%s",textwrite); 

Вы никогда не выделяется память для textwrite. Вы должны попробовать что-то вроде

textwrite = malloc(sizeof(char) * 128); 
scanf("127%s" , textwrite); 

Я не знаю, действительно ли это ваша проблема (пока).

+0

Сначала это была не моя проблема, но теперь это так. Благодаря! – smilinggoomba

4

Первая проблема, которую я вижу, это сравнение строк:

firstchoice=="~N~" 

должен быть

strcmp(firstchoice, "~N~") == 0 

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

Что касается ошибки сегментации после:

  1. Вы открыть новый файл, filenew = fopen(filenamenew,"r");, и если файл не существует, (if(!filenew)), вы пытаетесь писать в него (fprintf(filenew,"%s",textwrite);). Вам нужно сначала открыть его для написания.

  2. Вы называете scanf("%s",textwrite);, когда textwrite является неинициализированным указателем и это указывает на буфер не, он должен быть либо массив или указатель на выделенную память (на таНос, например). Эта ошибка существует со следующими переменными в вашем коде:

    • char * textwrite;
    • char * filenameopen;
    • char readchar;
    • char * textopen;

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

+0

Это определенно большая проблема, но не должна приводить к сбою программы. – Starkey

+0

Я не думаю, что программа выйдет из строя. Я думаю, что это просто неожиданно закончилось, но я могу ошибаться. – MByD

+1

@MByD Нет, скорее всего, он сбой в строке scanf до того, как он когда-либо попадет в строку сравнения строк. – Praetorian

0

Чтобы остановить ваш краш, не переходите в указатель на firstchoice, передайте сами переменные.

scanf("%s",firstchoice); 

Для массивов, вам не нужно брать указатель на функцию, как scanf. Вы делаете это со своим другом scanf.

Существует несколько проблем с кодом, который я не буду вдаваться в детали, потому что, очевидно, это учебное упражнение для вас. Сначала, хотя, избавьтесь от goto.

+0

На самом деле '& firstchoice' равен' firstchoice' ... – MByD

+0

@MByD Я не думаю, что вы правы с этим утверждением. Предупреждение о том, что посты в преторианстве доказывают обратное. – Starkey

+0

Это было в эфире, когда я услышал, но почему бы вам не попробовать? – MByD

0

scanf ожидает указатель на массив символов, вы передаете ему указатель на указатель на массив символов

scanf("%s",&firstchoice); 

выше линия должна быть

scanf("%s",firstchoice); 

или

scanf("%s",&firstchoice[0]); 

Кроме того, вы не можете просто сравнить массив символов с строковым литералом, используя ==, вы должны использовать strcmp.

При компиляции кода были сделаны следующие предупреждения. Я предлагаю вам начать обращать на них внимание; поднимите уровень предупреждений вашего компилятора, если вы их не видите.

prog.c: In function ‘main’: 
prog.c:22: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[200]’ 
prog.c:23: warning: comparison with string literal results in unspecified behavior 
prog.c:23: warning: comparison with string literal results in unspecified behavior 
prog.c:26: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[200]’ 
prog.c:53: warning: comparison with string literal results in unspecified behavior 
prog.c:53: warning: comparison with string literal results in unspecified behavior 
prog.c:57: warning: comparison with string literal results in unspecified behavior 
prog.c:57: warning: comparison with string literal results in unspecified behavior 
prog.c:61: warning: comparison with string literal results in unspecified behavior 
prog.c:61: warning: comparison with string literal results in unspecified behavior 
prog.c:83: warning: comparison with string literal results in unspecified behavior 
prog.c:83: warning: comparison with string literal results in unspecified behavior 
prog.c:22: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result 
prog.c:26: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result 
prog.c:49: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result 
prog.c:64: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result 
prog.c:81: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result 
prog.c:49: warning: ‘textwrite’ may be used uninitialized in this function 
prog.c:64: warning: ‘filenameopen’ may be used uninitialized in this function 
prog.c:81: warning: ‘textopen’ may be used uninitialized in this function 
+0

Предупреждения компиляции не имеют реального смысла в этом случае, когда вы работаете с массивами, тогда массив и указатель на массив одинаковы. – MByD

2
  • Вы сравниваете строки C с strcmp которые возвращают -1, 0 или 1 (0 означая равны). Существует также stricmp, который делает нечувствительность к регистру.
  • Scanf ожидает указателей на элементы и имя массива уже является указателем, поэтому не используйте &.
  • Проверить, существует ли файл: C check if file exists
  • Попробуйте перестроить свой код, чтобы он состоял из простых функций. Трудно читать и поддерживать монолитный код.
  • Включите отображение предупреждений (проверьте используемый вами компилятор). Ваш код должен компилироваться без предупреждений.
Смежные вопросы