前言:
当在写一个从终端接收一个字符串是,一般来说,是先定义一个具体大小的字符数组string[SIZE],然后通过scanf、gets等函数来输入。但一般来说,当输入完毕后,此时会有多余的空间,这明显浪费了电脑的内存空间。而接下来有这么一个函数,可以根据输入的大小而改变字符串大小来实现降低内存占用。
思路:
在输入一个字符串时,先不从整体输入,而是一个字符一个字符的输入,然后在字符的输入之前先扩宽一个字符的大小,之后再把字符输入到拓宽后的字符串里。
准备:
头文件<stdlib.h>中的calloc、realloc函数。
代码:
#include<stdio.h>
char* autoRecStr()
{
char* string = (char*)calloc(1, sizeof(char)); //先做好字符串的初始化
char c = '\0';
int i;
for (i = 0; (c = getchar()) != '\n'; i++)
if (string = realloc(string, sizeof(char) * (2 + i))) //确保不会返回NULL
*(string + i) = c;
else exit(0);
//最后一定要在字符串的最后加入'\0',不然会在显示的时候会在字符串后出现乱码
*(string + i) = '\0';
return string;
}
使用案例:
#include<stdlib.h>
#include<stdio.h>
char* autoRecStr()
{
char* string = (char*)calloc(1, sizeof(char)); //先做好字符串的初始化
char c = '\0';
int i;
for (i = 0; (c = getchar()) != '\n'; i++)
if (string = realloc(string, sizeof(char) * (2 + i))) //确保不会返回NULL
*(string + i) = c;
else exit(0);
//最后一定要在字符串的最后加入'\0',不然会在显示的时候会在字符串后出现乱码
*(string + i) = '\0';
return string;
}
main()
{
char* string;
string = autoRecStr();
printf("%s",string);
free(string); //记得释放内存
return 0;
}
效果:
结尾:
虽然这样可以减少内存占用,随输入大小而改变字符串大小,但明显地该函数可读性与效率远远不如直接定义具体的数组大小的字符串。另外,记得释放内存。