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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка с strpy, strpy не хочет копировать линии матрицы 
V
    Опции темы
VitaL
Дата 3.8.2007, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброе время суток!

У меня одна ламерская програмка, тема экзамена, даётся текстовый файл, нужно разделить цифры от букв, буквы засунуть в матрицу, это как раз не получается.

Буду рад любой помощи, спасибо.

Код

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct nodo
    {
    char num[81];
      struct nodo *sig;
   };
void separa(char *, char *, char *);
struct nodo * crear_cola(struct nodo *, char *, struct nodo**);
void mostrar(struct nodo *);
void main()
{
   struct nodo *p;
   struct nodo *u;
   p=u=NULL;
   int j=0,i=0;
   char mat[500][82];
    char cad[82];
   char let[82];
   char num[82];
   FILE * a;
   if((a=fopen("EXAMEN.txt","rt"))==NULL)
    {
       printf("Error archivo");getch();exit(1);
      }
   fgets(cad,82,a);
   while(!feof(a))
    {
       separa(cad, num, let);
         //printf("\n\n%s\t%s\t%s",cad, num,let);
         u=crear_cola(u,num,&p);
         strcpy(mat[i],let);//Вот тут что то не так 
         fgets(cad,82,a);
         if(feof(a))
          {
             separa(cad, num, let);
                    //printf("\n\n%s\t%s\t%s",cad, num,let);
               u=crear_cola(u,num,&p);
               i++;
               strcpy(mat[i],let);
            }
       i++;
      }
   for(j=0;j<i;j++)
    printf("%s\n",mat[i]);//пустота
   mostrar(p);
   getch();
   fclose(a);
}
void mostrar(struct nodo * p)
{
   struct nodo * aux;
    if(p==NULL)
    printf("Nodo vacio");
   else
    {
       while(p!=NULL)
          {
             printf("%s\n\n",p->num);
               aux=p;
               p=p->sig;
               free(aux);
            }

      }
}
void separa(char *cad, char * num, char *let)
{
   int i=0, j=0, x=0;
    while(*(cad+x)!='\0')
    {
        if(*(cad+x)=='0' || *(cad+x)=='1' || *(cad+x)=='2' || *(cad+x)=='3' || *(cad+x)=='4' || *(cad+x)=='5' || *(cad+x)=='6' || *(cad+x)=='7' || *(cad+x)=='8' || *(cad+x)=='9')
         {*(num+i)=*(cad+x);i++;}
        else
         {
          if(*(cad+x)!=' '&& *(cad+x)!='\n')
             {*(let+j)=*(cad+x);j++;}
         }
        x++;
      }
   *(num+i)='\0';*(let+j)='\0';
}
struct nodo * crear_cola(struct nodo *q, char * num, struct nodo **p)
{
    struct nodo * nuevo;
   if((nuevo=(struct nodo *)malloc(sizeof(struct nodo)))==NULL)
    {
       printf("Error memoria");getch();exit(1);
      }
   else
    {
       strcpy(nuevo->num,num);nuevo->sig=NULL;
            if(q)
                q->sig=nuevo;
            else
                *p=nuevo;
            q=nuevo;
      }
   return(q);
}


прикладываю .cpp и .txt

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  ejer_prog.rar 0,94 Kb
PM MAIL WWW Skype   Вверх
_hunter
Дата 3.8.2007, 10:59 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



не хочет strcpy копировать -- юзай memcpy. а вообще мог бы и провести исследование небольшое на тему "почему strpy не хочет копировать линии матрицы". т.е. посмотрел бы отладчиком на те линии (может там первым символом \0 идет). если все нормально -- написал бы тестовое приложеньице. вот проведя такое исследование и код не стыдно выкладывать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
codelord
Дата 3.8.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



а так преподу не подойдет smile
Код

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <bits/stream_iterator.h>
using namespace std;
int main( int argc, char **argv ) {
 vector< char > mysymbols;
 vector< char > mydigits;
 ifstream in( "EXAMEN.txt", ios::in );
 string str;
 while( !in.eof() ) {
 getline( in, str );
 for( int i = 0;  i < str.length() ; i++ ) {
  char c = str[i];
  if( c < '0' ||  c > '9' ) mysymbols.push_back( c );
  else mydigits.push_back( c );
  }
}
 cout << " My Symbols " << endl;
 copy( mysymbols.begin(), mysymbols.end(), ostream_iterator<char>(cout,"\n") );
 cout << " My Digits " << endl;
 copy( mydigits.begin(), mydigits.end(), ostream_iterator<char>(cout,"\n") );
 return 0;
}



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Dov
Дата 3.8.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(VitaL @  3.8.2007,  03:15 Найти цитируемый пост)
 printf("%s\n",mat[i]);//пустота

А так не пробовал?  smile 
mat[i] -> mat[j]



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
VitaL
Дата 4.8.2007, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Dov, спасибо, детская ошибка пипец.

codelord, боюсь мой препод такого не знает smile 

всем спасибо.

PM MAIL WWW Skype   Вверх
Dov
Дата 4.8.2007, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



VitaL, по моему, в твоём коде есть 'более взрослая ошибка'.  smile  Я имею ввиду ф-цию mostrar. На мой взгляд её нужно переписать таким образом:
Код

void mostrar(struct nodo ** p)
{
    struct nodo * aux;
    if(*p == NULL)
        printf("Nodo vacio");
    else
    {
        while(*p != NULL)
        {
            printf("%s\n",(*p)->num);
            aux =  *p;
            *p  = (*p)->sig;
            free(aux);
        }        
    }
}

Иначе память не будет правильно освобождаться.  smile 
Да и вобще, можно немного 'причесать' и остальные ф-ции. Ну, например, что-нибудь такое:
Код

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

struct nodo
{
    char num[81];
    struct nodo *sig;
};

void separa(char *, char *, char *);
void crear_cola(char *, struct nodo**);
void mostrar(struct nodo **);

int main()
{
    struct nodo *p = NULL;
    int  j, i = 0;
    char mat[500][82];
    char cad[82];
    char let[82];
    char num[82];
    FILE * a;

    if((a = fopen("EXAMEN.txt","rt")) == NULL)
        printf("Error archivo"), exit(1);
    
    while(fgets(cad, 82, a))
    {
        separa(cad, num, let);
        crear_cola(num, &p);
        strcpy(mat[i++], let);        
    }

    for(j = 0; j < i; j++)
        printf("%s\n", mat[j]);

    mostrar(&p);
    fclose(a);

    return 0;
}

void mostrar(struct nodo ** p)
{
    struct nodo * aux;
    if(*p == NULL)
        printf("Nodo vacio");
    else
    {
        while(*p != NULL)
        {
            printf("%s\n",(*p)->num);
            aux =  *p;
            *p  = (*p)->sig;
            free(aux);
        }        
    }
}

void separa(char *cad, char * num, char *let)
{
    while(*cad)
        (isdigit(*cad) ? *num++ : !isspace(*cad) ? *let++ : *cad) = *cad++;
    *num = *let = '\0';
}

void crear_cola(char * num, struct nodo **p)
{
    struct nodo * nuevo;
    if((nuevo = (struct nodo *)malloc(sizeof(struct nodo))) == NULL)
        printf("Error memoria"), exit(1);
    else
    {
        strcpy(nuevo->num, num);
        nuevo->sig = *p;
        *p = nuevo;
    }
}
 

Ну, это так, на любителя.  smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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