2017-02-18 7 views
0

Я пытаюсь сделать этот код, чтобы читать греческие буквы из файла и печатать английские буквы, которые звучат одинаково с помощью fscanf. Проблема в том, что я продолжаю получать ошибку сегментации. Что мне не хватает?Ошибка сегментации с помощью fscanf-not allocate memory issue

#include <stdio.h> 

int main() 
{    
    char s[100];  
    int i; 
    FILE * myfile; 

    myfile = fopen("/home/angelos/Downloads/λεξικο2.txt", "r"); 

    while(fscanf(myfile, "%s", s) == 1) 
     { 
      for (i=0 ; i<100 ; i++) 
       { 
        if (s[i] == 'Α') 
         { printf("A") ; } 
        else 
        if (s[i] == 'Β') 
         { printf("V") ; } 
     } 
} 
+2

Шаг 1: 'fscanf (MYFILE, "% S", S)' '-> fscanf (MYFILE, "% 99S", с)', чтобы предотвратить переполнение буфера , – chux

+1

Не получать доступ к чтению данных. 'for (i = 0; i <100; i ++)' -> 'for (i = 0; s [i]; i ++)'. Необходимо выяснить, какой ввод был использован для диагностики ошибки сегментации. Также проверьте, если 'myfile == NULL'. – chux

+2

Проверьте возвращаемое значение 'fopen'. – BLUEPIXY

ответ

1

У вас есть 3 серьезных проблемы с вашим кодом.

1) Вы никогда не проверяете, успешно ли fopen.

2) Вы можете читать неинициализированные подписанные данные.

3) Вы можете переполнить ваш входной буфер

Все три вещи могут привести к вашей программе на провал.

Попробуйте эти изменения:

#include <stdio.h> 
#include <string.h> 

int main() 
{    
    char s[100];  
    int i; 
    FILE * myfile; 

    myfile = fopen("/home/angelos/Downloads/λεξικο2.txt", "r"); 

    // Check that fopen went fine 
    if (!myfile) 
    { 
     printf("Failed to open file\n"); 
     return 1; 
    } 

    while(fscanf(myfile, "%99s", s) == 1) 
         // ^^ 
         // Never read more than 99 chars (i.e. 99 + a terminating null byte) 
     { 
      for (i=0 ; i<strlen(s) ; i++) 
         // ^^^^^^ 
         // Only iterate over the valid chars 
       { 
        if (s[i] == 'Α') 
         { printf("A") ; } 
        else 
        if (s[i] == 'Β') 
         { printf("V") ; } 
     } 
} 
+0

Я пробую этот точный код. Сначала он не распознал strlen (s), и когда я заменил его тем, что у меня было с самого начала, я получил ошибку сегментации –

+0

oh вы правы .. однако просто попробовал еще деградировать ошибку –

+0

ОБНОВЛЕНИЕ: Я забыл написать строку Он не возвращает файл. И что же мне делать? –