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
/* 從檔案中讀入未知筆數的字串, 一行一串字串, 動態增加 pointer to char* 指到的空
 * 間大小, 以增加字元指標數, 然後再讀入不同長度的字串, 再配置夠大的空間儲存字元
 */
#include <stdio.h>
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////////////// 
enum
{
   MAX_STRING_LENGTH = 100    
}; 
//////////////////////////////////////////////////////////////////////////////// 
void printStrings( char **array, int arraySize );
void freeStorage( char **array, int arraySize ); 
////////////////////////////////////////////////////////////////////////////////
int main()
{
    char **array = NULL; // 二次指標 
    int dataCount = 0; // 資料筆數 
    
    FILE *file = fopen( "test.txt", "r" ); 
    char buffer[MAX_STRING_LENGTH + 1]; 
    
    while( fgets( buffer, MAX_STRING_LENGTH, file ) != NULL )
    {    
       ++dataCount;
       // 配置新指標 
       array = realloc( array, sizeof(char*) * dataCount );
       
       int length = strlen(buffer);
       if( buffer[ length - 1 ] == '\n' )
          buffer[ length - 1 ] = '\0'; 
        
       // 配置儲存字串的記憶體 
       array[dataCount - 1] = malloc( sizeof(char)*strlen(buffer) + sizeof(char) ); 
       // 複製字串 
       strcpy( array[dataCount - 1], buffer );    
    }
    
    printStrings( array, dataCount );
    freeStorage( array, dataCount );
    
    array = NULL;
    
    system("pause");    
} 

////////////////////////////////////////////////////////////////////////////////
void printStrings( char **array, int arraySize )
{
   int index;
   for ( index = 0; index != arraySize; ++index )
      puts( array[ index ] );
}


void freeStorage( char **array, int arraySize )
{
   int index;  
   for ( index = 0; index != arraySize; ++index )
      free( array[ index ] );
   
   free( array );          
}