Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка с strpy


Автор: VitaL 3.8.2007, 03:15
Доброе время суток!

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

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

Код

#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

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

Автор: codelord 3.8.2007, 11:40
а так преподу не подойдет 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;
}

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

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

Автор: VitaL 4.8.2007, 01:31
Dov, спасибо, детская ошибка пипец.

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

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

Автор: Dov 4.8.2007, 05:23
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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)