Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 14
1

Сортировка слов в алфавитном порядке. Error: Segmentation fault

26.05.2013, 21:45. Показов 2131. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разработать программу, которая выводит на экран содержимое текущего каталога в алфавитном порядке. Каталоги не выводить.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
 
 
 
void swap( char *a, char *b)
{
    char *tmp;
    strcpy(tmp,a);
    strcpy(a,b);
    strcpy(b,tmp);
}
 
int main(void)
{
    char *string[PATH_MAX];
    struct stat st;
    struct dirent *dirinf;
    DIR *hdir;
    hdir = opendir(".");
    int i = 0;
    short int exit = 0;
    while (dirinf = readdir(hdir))
    {   
        if(S_ISDIR(st.st_mode))
            continue;
        stat(dirinf->d_name, &st);
        string[i] = dirinf->d_name;
        i++;
 
    }
    int l;
    for (l = 0; exit != 1; l++)
    {
        exit = 1;
        int j;
        for (j = 0; j<i-1; j++)
        {
        int k;
            for (k = j; k<i+1; k++)
            {
                    if (*string[j] > *string[k])
                    {
                        swap(string[j],string[k]);
                    }
            }
            
            for (j = 0; j<i; j++)
                if ( *string[j] != '\0' )
                {
                    string[j]++;
                    exit = 0;
                }   
        }
    }
    int m;
    for (m = 0; m<i; m++)
        printf("\%s\t", string[m]);
 
    closedir(hdir);
    return 0;
}
Где-то, видимо, выхожу "за грани дозволенного", но где?

Добавлено через 11 минут
Я темой ошибся, перекиньте в С под Linux
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2013, 21:45
Ответы с готовыми решениями:

error: Segmentation fault
Доброго времени суток, пишу с просьбой помочь найти проблему Segmentation fault. Написал...

Программа в порядке, однако segmentation fault.
Код правильный, программа компилируется, работает как надо, однако при выходе получаю Segmentation...

Сортировка слов в алфавитном порядке
Задан любой текст.Выпонить сортировку слов этого текста в алфавитном порядке.

Сортировка слов в алфавитном порядке
Дан текст из несколько слов. Нужно вывести слова в алфавитном порядке по первой букве.

6
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
27.05.2013, 10:21 2
ЧемодаНосок, а что под tmp в строке 11 память не нужно выделять? Вы сами подумайте, куда ваша строка a будет копироваться.
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 14
27.05.2013, 18:03  [ТС] 3
anmartex, переделал. Объявил так:

C
1
2
3
4
5
6
7
void swap( char *a, char *b)
{
    char tmp[PATH_MAX];
    strcpy(tmp,a);
    strcpy(a,b);
    strcpy(b,tmp);
}
Все равно, все таже Segmentation fault

Добавлено через 43 минуты
Поглядел, позакрывал некоторые блоки, все равно - segmentation fault. Изменил цикл
C
1
for (l = 0; exit != 0; l++);
на цикл
C
1
while (exit == 0)
- segmentation fault. Помогите найти ошибку и разобраться.
0
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
27.05.2013, 19:41 4
Цитата Сообщение от ЧемодаНосок Посмотреть сообщение
Помогите найти ошибку и разобраться.
  1. Строка 28-30: интересно, вы сначала проверяете является ли файл директорией, а потом только считываете его атрибуты.
  2. Строка 31: Так нельзя делать, ибо на следующей итерации под указателем dirinf->d_name значение и указатель будут другие, а из под старого память освободится. Хотя я не лазил в исходники и не могу точно сказать, как она работает, но то что ваши действия ошибочны это однозначно.
  3. ... остальное даже не стал анализировать.

А не проще?:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
 
int main()
{
   struct dirent** namelist;
   struct stat info;
   int i;
   int n = scandir(".", &namelist, NULL, alphasort);
 
   if (n > -1)
   {
      for (i = 0; i < n; ++i)
      {
         stat(namelist[i]->d_name, &info);
         if (!S_ISDIR(info.st_mode))
         {
            printf("%s\n", namelist[i]->d_name);
         }
         free(namelist[i]);
      }
      free(namelist);
   }
   else
   {
      perror("scandir");
   }
 
   return 0;
}
1
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 14
27.05.2013, 20:38  [ТС] 5
anmartex, действительно, проще) Си только начинаю изучать, поэтому не все функции известны. Спасибо.

Добавлено через 14 минут
anmartex, обязательно ли освобождать память в данном случае?
0
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
28.05.2013, 03:37 6
Цитата Сообщение от ЧемодаНосок Посмотреть сообщение
anmartex, обязательно ли освобождать память в данном случае?
scandir
...
The memory allocated for the array can be deallocated with free(3), by freeing each pointer in the array and then the array itself.
...
Иными словами - обязательно.
0
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 14
28.05.2013, 10:36  [ТС] 7
anmartex, ясно, спасибо.
0
28.05.2013, 10:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2013, 10:36
Помогаю со студенческими работами здесь

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

Сортировка слов в алфавитном порядке
как с помощью логической функции, сравнивающей два слова, напечатать три слова в алфавитном...

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

Сортировка слов текста в алфавитном порядке
Привет,есть такой код: public class main { public static void main(String args) throws...

Сортировка слов массива в алфавитном порядке
Дано предложение, между словами которого может быть любое число пробелов. Вывести слова данного...

Сортировка массива слов в алфавитном порядке
Здравствуйте, хотел узнать как можно произвести &quot;сортировку букв в массиве слов в алфавитном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru