C언어 malloc 사용하여 텍스트 파일을 불러 단어 평균 길이 구하기.

C언어 malloc 사용하여 텍스트 파일을 불러 단어 평균 길이 구하기.

작성일 2009.06.29댓글 2건
    게시물 수정 , 삭제는 로그인 필요

키보드 입력으로 지정한 파일로 data를 읽어

파일내에 단어를 출력, 또 전체 단어의 평균길이를 구합니다.

 

조건 : 동적 메모리로 확보,

2. 중복된 단어는 한번만 처리.

 

일단 저는 그냥 메모리를 줬는데

이걸 malloc을 사용하여 동적으로 줘야 하거든요... 그걸 잘 못하겠어서...

그리고 중복된 단어를 어떻게 처리하는지...

 

실행화면에서 파일명을 입력하면 결과는

 

(텍스트가 이육사의 광야라고 한다면,,)

1번째 단어 : 광야           단어길이 : 4

2번째 단어 : 이육사        단어길이 : 6

.               : 까마득한      단어길이 : 8

: 날에 단어길이 : 4

.

.

.

통합 갯수 : 평균단어길이 :

 

 

이렇게 구해야 합니다.

제가 지금 만든걸로는 통합갯수가 중복된 것이 제외되지 않거든요..

그리고 단어길이와 평균단어 길이도 안되구요..

좀 고쳐주세요.

---------------------------------------

#include "stdio.h"

 

int main(void)
{
     // 읽은 단어들을 저장할 단어문자열 배열공간을 선언
     char words[100][32];
     char file[255];
     int pre;
     int i=0, count;

 

     // 읽을 화일에 대한 포인터
     FILE* fin;

 

     // 질문이 화일로 부터 입력을 받을지 키보드로 입력을
     // 받을지 명확하지가 아니하므로 ..
     printf( "파일을 입력하세요. 파일 내 단어들의 평균 길이를 알려드립니다. \n" );
     pre = getchar();

 

     // 그냥 엔터 했으면 화일포인터를 stdin( 표준입력으로 지정 )
     if( pre == '\n' )

       fin = stdin;
     else
     {
         ungetc( pre, stdin );
         gets( file );
         fin  = fopen( file, "rt" );

         if( fin == NULL )
         {
           printf( "지정하신 파일을 열 수가 없습니다.\n" );
           return 1;
         }
     }

 

    

     while(1)
     {
         if( fin == stdin )
            printf( "\n단어입력 <엔터키>\n종료는 EOF(Ctrl+Z)입력\n" );

         if( fscanf( fin, "%s", words[i] ) !=1 )
            break;

         i++;
     }

     count = i;
     printf( "%d개의 단어를 읽었습니다.\n", count );

 

     
     for( i = 0; i < count; i++ )
  
   printf( "%d 번째 단어 : %s        단어길이 : \n", i,words[i] );

 

     if( fin != stdin )
        fclose( fin );

 

     return 0;

}

 


#c언어 malloc #c언어 malloc free #c언어 malloc 배열 #c언어 malloc 쓰는 이유 #c언어 malloc calloc #c언어 malloc 2차원 배열 #c언어 malloc 사용법 #c언어 malloc 헤더 #c언어 malloc.h #c언어 malloc 초기화

profile_image 익명 작성일 -

c를 워낙에 해본지가 오래되어서 잘 모르겠으나 몇가지 생각해보자면..

 

     while(1)
     {
         if( fin == stdin )
            printf( "\n단어입력 <엔터키>\n종료는 EOF(Ctrl+Z)입력\n" );

         if( fscanf( fin, "%s", words[i] ) !=1 )
            break;

         i++;
     }

 

여기에다가

 

우선 sizeof(word[i])를 fscanf 다음에 써보면 어떨까 제안을 해봅니다.

기억이 잘 안나는데.. 아마도 길이에 맞게 나올거라고 봅니다.

길이가 나온다면 이걸 int 변수하나 만들어서 계속 더하면 총 길이가 나올듯.

 

그다음 중복단어 체크 문제인데,

strcmp라는게 있습니다.  string.h 헤더를 쓰는데요

요놈이 스트링 두개를 비교해 줄겁니다.

같으면 0인데,

 

이걸 이용하면 반복구문 써서 앞에 꺼랑 비교해서 같으면, i++를 하지 말고 넘어가서

word[]에 저장하지 않게 하면 될거 같다는 생각이 듭니다.

 

strcmp 자세한 정보는

 

http://www.winapi.co.kr/  -> c/c++레퍼런스 에 보시면 있습니다.

 

profile_image 익명 작성일 -

문자열 관련 함수는 써보지 않은 건가요?

문자열 길이를 알아내고, NULL까지 고려해서 그 길이만큼 동적 할당 받으면 됩니다.

 

 

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

#define MAX_WORD (200)   // 최대 저장 단어.

int main()
{
     // 읽은 단어들을 저장할 단어문자열 배열공간을 선언
     char *words[MAX_WORD];
     int count;  // 저장된 단어 개수.
     int total_length; // 총 길이.
     float avg_length; // 평균 길이.

     char file[255];
     char in_buffer[500];  // 한 줄을 읽을 버퍼.
     int pre;
     int i;

 

     // 읽을 화일에 대한 포인터
     FILE* fin;

 

     // 질문이 화일로 부터 입력을 받을지 키보드로 입력을
     // 받을지 명확하지가 아니하므로 ..
     printf( "파일을 입력하세요. 파일 내 단어들의 평균 길이를 알려드립니다. \n" );
     pre = getchar();

 

     // 그냥 엔터 했으면 화일포인터를 stdin( 표준입력으로 지정 )
     if( pre == '\n' )

       fin = stdin;
     else
     {
         ungetc( pre, stdin );
         gets( file );
         fin  = fopen( file, "rt" );

         if( fin == NULL )
         {
           printf( "지정하신 파일을 열 수가 없습니다.\n" );
           return 1;
         }
     }

 

 

    count = 0;
    total_length=0;

     while(1)
     {
         if( fin == stdin )
            printf( "\n단어입력 <엔터키>\n종료는 EOF(Ctrl+Z)입력\n" );

         if( fscanf( fin, "%s", in_buffer ) !=1 )
            break;

        // 기존 저장된 단어에 있는 것인지 체크.
        for (i=0; i<count; i++) {

            // 존재하면 while 재실행.
            if (  strcmp(words[i], in_buffer)==0 ) continue;

        }

        // 마지막 NULL까지 포함한 문자열을 동적 할당.
        words[count] = (char*)malloc(strlen(in_buffer)+1);

        // 문자열 복사.
        strcpy( words[count], in_buffer);

        total_length += strlen(in_buffer);  // 길이 누적.
        count++;  // 저장 개수 증가.

     }

     printf( "%d개의 단어를 읽었습니다.\n", count );

     for( i = 0; i < count; i++ )
        printf( "%d 번째 단어 : %s        단어길이: %d\n", i,words[i], strlen(words[i]) );

     avg_length = (float)total_length / count; // 평균 길이.

     printf("평균 단어 길이=%.1f \n", avg_length); // 소수 첫째자리까지 출력.


     if( fin != stdin )
        fclose( fin );

 

     return 0;

}

 

 

c언어 malloc으로 동적 배열.....

... malloc사용 해서 2차원 배열 .. 100*1000, integer라면...... 위치를 구하기 위해선, 1*j*k + 2*k + 3가 돼는거죠, int a... 그렇게 편리하다면 애초 c언어 헤더파일로 하나...

C언어에서 텍스트파일의 내용을...

... 저 텍스트파일에서 쉼표나 따옴표같은 부호랑 숫자는 다 빼고 영어단어만 골라서 이진트리에... h> // isalpha 함수를 사용하기 위하여 // strtok...