Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при выполнении, Склоняюсь в сторону приведения типов 
V
    Опции темы
qw1mb0
Дата 13.2.2012, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



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

#include <stdio.h>
#include <string.h>
#define MAXLINE 100
//int getline(char line[], int maxline);

void main(void)
{
char s[10];
int i;
char *p;
char g[10];
char gz[10];
FILE *file, *out;
out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
sscanf(s,"%s", g);
gz[i]=atoi(g);
i++;
printf("%s\n",&gz[i]);
}
fclose(file);
fclose(out);
}

В цикле while я беру строку, с помощью функции sscanf получаю необходимое мне слово. 
Далее мне нужно присвоить итому элементу массива gz, указатель на это слово, что бы в итоге получить массив указателей и в дальнейшем нужно с помощью сортировку упорядочить эти элементы. 
Программа завершается аварийно. В чем проблема не пойму. Как присвоить и в итоге получить этот массив. Для дальнейшей сортировки. 
Спасибо большое заранее. Буду благодарен за дельные советы.
PM MAIL ICQ Skype   Вверх
tzirechnoy
Дата 13.2.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Цитата
Код
while(fgets(s, MAXLINE, file)){


Вы в строку размера 10 читаете до 100 символов. Это ошыбка.

[quote]
Код
gz[i]=atoi(g);
[/code]

Переменная i неиницыализирована. Кроме того, atoi у меня содержытся в stdlib.h, который неподключен.

Цитата
Код
printf("%s\n",&gz[i]);


Строка gz после i неиницыализирована, в частности, туда, вероятно, никто не записал символ окончания строки '\0'. Хотя есть вариант, что пользователь ввёл 0 с клавиатуры, тогда этот код выведет просто перевод строки, но он довольно безсмысленнен.


Цитата
 итому элементу массива gz, указатель на это слово,


Массив gz состоит из чаров (8-битных цэлых чисел, от -128 до 127), присваивать ему указатели будет сложновато.

Впрочем, atoi и не возвращает никаких указателей ни на что -- оно преобразует человекочитаемую строчку цыфр в цэлое число во внутреннем машынном представлении.









PM MAIL   Вверх
qw1mb0
Дата 13.2.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Цитата

Вы в строку размера 10 читаете до 100 символов. Это ошыбка.

Подправил

Цитата

Переменная i неиницыализирована. Кроме того, atoi у меня содержытся в stdlib.h, который неподключен

вначале изменил int i; на int i=0;

Цитата

Строка gz после i неиницыализирована, в частности, туда, вероятно, никто не записал символ окончания строки '\0'. Хотя есть вариант, что пользователь ввёл 0 с клавиатуры, тогда этот код выведет просто перевод строки, но он довольно безсмысленнен.

Честно говоря не очень понял. Не могли бы привести пример как добавить \0. 

Пока что программа не сильно изменилась:
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 100

void main(void)
{
char s[100];
int i=0;
char *p;
char g[10];
char gz[10];
FILE *file, *out;
out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
sscanf(s,"%s", g);
gz[i]=*g;
i++;
printf("%s\n",&gz[i]);
}
fclose(file);
fclose(out);
}


Выводит какие-то знаки.
Если заменить в printf %s на %d выводит числовое представление.

Что-то не особо даются мне типы и указатели....

PM MAIL ICQ Skype   Вверх
qw1mb0
Дата 13.2.2012, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Немного переписал программу и добавил структуру.
Вот что получилось:
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 100

struct filel{
    char name[10];
    char type[3];
    char date[15];
    unsigned int treatment;
    unsigned long int syze;
    char modify[7];
    }filel_info,filel_list[100]    ;
    
void main(void)
{
struct filel filel_list[100];
struct filel filel_info;
char s[100];
int i=0;
char *p;
char g[10];
char gz[10];
FILE *file, *out;
out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
sscanf(s,"%s", filel_list[i].name);
i++;
printf("%s\n",&filel_list[i].name);
}
fclose(file);
fclose(out);
}

Выводяться крякозябры. Что я делаю не так, почему в filel_list[i].name хранится не строка?

Добавлено через 4 минуты и 5 секунд
Хм... Интересно. Переставил i++; после printf и стало выводить то. что мне надо....

Добавлено через 9 минут и 37 секунд
Тогда другой вопрос:
Допустим есть строка: Filename exe 12.12.12 32 1282 82.32 
где 1. Имя файла, 2. Тип файла, 3. Дата создания, 4. Количество обращений, 5. размер, 6. Дата последней модификации
Как можно заполнить структуру:
Код

struct filel{
    char name[10];
    char type[3];
    char date[15];
    unsigned int treatment;
    unsigned long int syze;
    char modify[7];
    }filel_info,filel_list[100]    ;

нужными полями данных?
PM MAIL ICQ Skype   Вверх
feodorv
Дата 13.2.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(qw1mb0 @  13.2.2012,  20:06 Найти цитируемый пост)
Как можно заполнить структуру

Вручную парсить строку, проверяя корректность данных.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
qw1mb0
Дата 13.2.2012, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Дошел до такой конструкции:
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 100

struct filel{
    char *name;
    char *type;
    char *date;
    unsigned int treatment;
    unsigned long int syze;
    char *modify;
    }filel_info,filel_list[100]    ;
    
void main(void)
{
struct filel filel_list[100];
struct filel filel_info;
char s[100];
int i=0;
int p=0;
char g[10];
char gz[10];
char z[10];
FILE *file, *out;
out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
while(sscanf(s,"%s", &z)){
switch(p++){
case '0':
    filel_list[i].name = z;
    break;
case '1':
    filel_list[i].type = z;
    break;
case '2':
    filel_list[i].date = z;
    break;
case '3':
    filel_list[i].treatment = *(int*)z;
    break;
case '4':
    filel_list[i].syze = *(int*)z;
    break;
case '5':
    filel_list[i].modify = z;
    break;
default:
    break;
    }
    }

printf("%s\n",&filel_list[i].name);
i++;
}
fclose(file);
fclose(out);
}


Но при выполнении программа зависает. Может кто-то может взглянуть и сказать свою точку зрения? В чем может быть ошибка
PM MAIL ICQ Skype   Вверх
rumit7
Дата 14.2.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: нет
Всего: 7



Цитата(qw1mb0 @ 13.2.2012,  22:13)
Дошел до такой конструкции:
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 100

struct filel{
    char *name;
    char *type;
    char *date;
    unsigned int treatment;
    unsigned long int syze;
    char *modify;
    }filel_info,filel_list[100]    ;
    
void main(void)
{
struct filel filel_list[100];
struct filel filel_info;
char s[100];
int i=0;
int p=0;
char g[10];
char gz[10];
char z[10];
FILE *file, *out;
out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
while(sscanf(s,"%s", &z)){
switch(p++){
case '0':
    filel_list[i].name = z;
    break;
case '1':
    filel_list[i].type = z;
    break;
case '2':
    filel_list[i].date = z;
    break;
case '3':
    filel_list[i].treatment = *(int*)z;
    break;
case '4':
    filel_list[i].syze = *(int*)z;
    break;
case '5':
    filel_list[i].modify = z;
    break;
default:
    break;
    }
    }

printf("%s\n",&filel_list[i].name);
i++;
}
fclose(file);
fclose(out);
}


Но при выполнении программа зависает. Может кто-то может взглянуть и сказать свою точку зрения? В чем может быть ошибка

1) Массив z в который Вы считываете слова имеет размер 10. Это значит, что Вы можете его запросто переполнить, т.е. выйти за пределы памяти, которую Вам выделеди. Это может привести к большим проблемам. Либо увеличти его размер до 100 (такой-же как и размер массива s), либо используйте вместо "%s" - "%ns", где n зависит от размера массива. Более подробно читайте в книгах. У Стефана Прата есть хорошая книга по Си. Там работа со строками расписывается очень подробно;

2) Нельзя просто так присваивать массив z указателю name! Теперь указатель name будет указывать на область памяти массива z. А в следующей итерации цикла while, Вы в массив z уже считываете что-то другое. Таким образом теряете предыдущее значение. Для всех name, type, date память нужно выделять отдельно (их либо нужно сделать массивами соот. длины, или выделить память динамически при помощи функции malloc) и затем комировать туда при помощи функции strcpy() или strncpy(), что безопаснее;

3) Так делать нельзя: filel_list[i].syze = *(int*)z. Нужно вызывать функцию, которая предназначена для преобразования из строки в число. Что-то вроде atoi или sscanf..

4) Переменная p имеет тип int и иницилизируется нулевым значением. Дальше в конструкции swicth Вы сравниваете p с символами '0', '1'.. Так не правильно, нужно сравнивать с числами 0,1,2...

Наверное легче исправить Ваш код самому, чем рассказывать азы программирования на Си. В общем читайте сначала книги..   
PM MAIL   Вверх
rumit7
Дата 14.2.2012, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: нет
Всего: 7



Наверное так:

Код

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

#define MAXLINE 100
#define MAXROW 100

struct filel
{
    char name[MAXLINE];
    char type[MAXLINE];
    char date[MAXLINE];
    
    unsigned int treatment;
    unsigned long int syze;
    char modify[MAXLINE];
    
};
    
void main(void)
{
    struct filel filel_list[MAXROW];

    char read_line[MAXLINE];

    FILE * file = fopen("lab3.txt","r");

    if(file)
    {
            int i=0;
        while( (i < MAXROW) && fgets(read_line, MAXLINE, file) )
        {
            sscanf(read_line, "%s %s %s %u %lu %s", filel_list[i].name, 
                                                    filel_list[i].type, 
                                                    filel_list[i].date, 
                                                    &filel_list[i].treatment, 
                                                    &filel_list[i].syze, 
                                                    filel_list[i].modify);
            
            printf("%s\n", filel_list[i].name);
            i++;
        }
        fclose(file);
    
    }else{
    
        printf("Cannot open file\n");
    }
}


Код не проверял, писал в браузере..
PM MAIL   Вверх
feodorv
Дата 15.2.2012, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



rumit7, спасибо!
С этим вопросом как-то разобрались smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1171 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.