代码写得优美、易懂__第二版
程序代码:
/***************************************************************************
* *
* File : strings.c *
* *
* Purpose : Unlimit string's count and string's size input. *
* *
* Author : Dennis Date : 00/00/0000 *
* *
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _STDC_WANT_LIB_EXT1_ 1
#define buffer_len 10
#define buffer_len_inc 5
#define string_cont 5
#define string_cont_inc 2
typedef struct point point;
struct point
{
char* point_start;
char* point_end;
}buffer = {NULL, NULL};
//function prototype
char** memory_init_1(int size);
char* memory_init_2(int size);
point get_string(point buf, int length);
//char* add_buf_memory(char* start, char* end);
void store_strings(char** str, int cont,int cur_buf_len, point buf);
char** add_str_memory(char** str_st ,int count, int str_count);
void output_strings(char** str_st, int count);
int main(void)
{
//variable declare
int buf_len = buffer_len;
int current_buf_len = 0;
char** str_dre_dre = NULL;
char** str_start = NULL;
int count = 0;
int str_cont = string_cont;
//初始化分配内存
str_start = str_dre_dre = memory_init_1(str_cont * sizeof(char*));
buffer.point_start = buffer.point_end = memory_init_2(buf_len * sizeof(char));
//
printf("input something you want : \n");
do{
if(count > 0)
buffer.point_end = buffer.point_start;
buffer = get_string(buffer, buf_len);
if(*(buffer.point_start) == '\n' && count == 0)
{
printf("you don't input anything\n");
break;
}
*(buffer.point_end - 1) = '\0';
current_buf_len = strlen(buffer.point_start);
store_strings(str_dre_dre, count, current_buf_len, buffer);
if(count == str_cont -1)
str_dre_dre = str_start =add_str_memory(str_start, count, str_cont);
count++;
printf("you are already input %d string%s.\n",count, (count == 1) ? "" : "s");
printf("continue?(Y/N)");
fflush(stdin);
}
while(tolower((char)getchar()) == 'y');
//output strings
printf("output strings: \n");
output_strings(str_start, count);
//release memory
for(int i =0; i < count; ++i)
{
free(*(str_start + i));
*(str_start + i) = NULL;
}
free(buffer.point_start);
buffer.point_end = buffer.point_start = NULL;
str_start = str_dre_dre = NULL;
return 0;
}
/*************function declare******************/
//memory initialization for string's address
char** memory_init_1(int size)
{
char** str = NULL;
str = (char**)malloc(size);
if(str == NULL)
{
printf("malloc() function error!!!\n");
exit(1);
}
return str;
}
//memory initialization for input buffer
char* memory_init_2(int size)
{
char* p_buf = NULL;
p_buf = (char*)malloc(size);
if(p_buf == NULL)
{
printf("malloc() function error!!!\n");
exit(1);
}
return p_buf;
}
//input string and add input buffer memory
point get_string(point buf, int length)
{
fflush(stdin);
char* buf_temp = NULL;
do
{
*(buf.point_end) = getchar();
buf.point_end++;
if(buf.point_end - buf.point_start == length)
{
length += buffer_len_inc;
buf_temp = (char*)realloc(buf.point_start, length * sizeof(char));
if(buf_temp == NULL)
{
printf("realloc() function error!!!\n");
exit(1);
}
buf.point_end = buf_temp + (buf.point_end - buf.point_start);
buf.point_start = buf_temp;
buf_temp = NULL;
}
}
while(*(buf.point_end - 1) != '\n');
return buf;
}
//store string
void store_strings(char** str, int cont, int cur_buf_len, point buf)
{
int test_int = 0;
*(str + cont) = (char*)malloc(cur_buf_len);
if(*(str + cont) == NULL)
{
printf("malloc() function error");
exit(1);
}
test_int = strcpy_s(*(str + cont), cur_buf_len + 1, buf.point_start);
if(test_int == !0)
{
printf("strcpy_s() function error!!!\n");
exit(1);
}
}
//add memory to store string
char** add_str_memory(char** str_st ,int count, int str_count)
{
char** str_dre_temp = NULL;
str_count += string_cont_inc;
str_dre_temp = (char**)realloc(str_st, str_count * sizeof(char*));
if(str_dre_temp == NULL)
{
printf("realloc() function error!!!\n");
exit(1);
}
return str_dre_temp;
}
//output stings function
void output_strings(char** str_st, int count)
{
for(int i = 0; i < count; ++i)
{
printf("%s\n", *(str_st + i));
}
}
上一版程序:
http://bbs.bccn.net/thread-443501-1-1.html
程序功能还是输入/输出不限制长度,不限制个数的字符串。
在听了各位大神的意见后,我根据在国外网站上看到的程例,自己模仿写了一个第二版程序,代码相对于上一版main()函数里少了不少东西,都用子函数代替了原来又臭又长的main()函数里的内容。但是感觉逻辑还是比较难懂的,主要就是在char** 和 char* 这个难懂。






