1

Тема: Файли С

Доброго дня, я студент і початківець в С. Мені потрібно підрахувати кількість малих латинських букв, до 10-го символу включно, які було зчитано з файлу. В файлі записано
https://replace.org.ua/uploads/images/10728/881da11067974aea4b8494f85b48b25e.png

{
    FILE *file=NULL;
    char name[20], c[10];
    int num=0, i;
    printf("Введіть ім'я другого текстового файлу: ");
    scanf("%s", name);
    file = fopen(name, "rt");
    if (file == NULL)
    {
        printf("Не вдалось відкрити файл!\n");
        return 0;
    }
    while(i!=10)
    {
        c[i++]=fgetc(file);
    }
    c[i]='\0';
    for (i=0; i<=10; i++)
    {
     if(isalpha(c[i]));
     {
      num++;
     }
    }
    printf("%d\n", num);


    fclose(file);
    return 0;
}

Але під час виконня програми вибиває завершення роботи
https://replace.org.ua/uploads/images/10728/f669f1fe01b671c8de2a628c7f75bdb3.png

Подякували: koala1

2 Востаннє редагувалося ur_naz (02.12.2020 16:12:06)

Re: Файли С

i<=10
і бабам про макітрі аксес виолейшн або сегментейшн фол

3

Re: Файли С

Для початку, дякую за добре сформульоване питання. Принаймні, значно краще за те, що тут зазвичай буває.
По вашій проблемі:

    int num=0, i; //значення i невизначене. Може, 0, може, 10, може, 1000000, може, -1000000 - просто сміття з пам'яті
    ...
    while(i!=10) //навряд чи невизначене значення випадково буде 10, тому, швидше за все, виконається
    {
        c[i++]=fgetc(file); //пишемо невідомо куди. Наприклад, у c[1000000]. Чи у c[-1000000]. Звідси і помилка.
    }

Щоб два рази не вставати:

   for (i=0; i<=10; i++)

це цикл на 11 ітерацій. Зазвичай пишуть i<10.
Ну і вам треба полічити малі літери, це функція islower, а не isalpha.

Ще пара зауважень:
- бажано надавати мінімальний компільований приклад. Так, часто це складно, особливо новачкам; але не варто викидати шматки коду, без яких програма не компілюється; а якщо ви певні, що помилка точно у фрагменті, який ви наводите - бажано вказувати, чому ви так вважаєте (наприклад, згадати, що виводилося "Введіть ім'я другого текстового файлу:").
- я точно не певен, чого ви очікуєте, але ви можете тут отримати результат на 1 менший за очікуваний. Символ нового рядка також буде перевірено, і він не є літерою. Якщо ви в курсі - добре.
- перемкніть мову Windows. Вам самому буде зручніше.

Подякували: flappy_dog1

4

Re: Файли С

У мене є новий файл з якого зчитується одновимірний масив і записується в mas. Мені потрібно поміняти місцями елементи з парним та непарним індексом. Я зробив це так:

for (int i=0; i<n; i++)
    {
     if(i%2==0)
     {
         buffer=mas[i];
         mas[i]=mas[i-1];
         mas[i-1]=mas[i];
     }
    }

    printf("Перетворений масив mas[%d] :\n", n);

    for (int i=0; i<n; i++)
    {
        printf("%7d\n", mas[i]);
    }

Але виводиться ось такий результат
https://replace.org.ua/uploads/images/10728/30a345d58cf8b06cb398472565e9e1ee.png

5

Re: Файли С

Я б зробив 2, не знаю чи спрацює:

char tb[2];//temp buffer
for (int i=0; i<n/2; i=i+2)
{
   tb[i]=mas[i];
   tb[i+1]=mas[i+1];

   mas[i]=tb[i+1];
   mas[i+1]=tb[i];
}

Але тоді n має бути тільки парним

6

Re: Файли С

Будь ласка, підставте конкретні числа і пройдіться вручну по ваших циклах. Там дуже примітивні помилки, я певен, що ви їх самі легко виявите. Особливу увагу зверніть на першу, останню ітерації та умову виходу.

Подякували: flappy_dog1

7

Re: Файли С

Так дякую, справді зробив помилку із-за неуважності.