如何dynamic地分配一个string的内存空间,并从用户获取该string?
我想用C程序读取用户的input。 我不想使用数组,
char names[50];
因为如果用户给出长度为10的string,则剩余空间被浪费。
如果我使用字符指针,
char *names;
那么我需要为此分配内存,
names = (char *)malloc(20 * sizeof(char));
在这种情况下,也有内存浪费的可能性。
所以,我需要的是dynamic分配一个与string长度完全相同的string的内存。
让我们假设,
如果用户input是"stackoverflow"
,那么分配的内存应该是14
(即string的长度= 13,'\ 0'有1个额外的空间)。
我怎么能做到这一点?
一次读取一个字符(使用getc(stdin)
)并随着string( realloc
)逐渐增大。
这是我前一段时间写的一个function。 注意它仅用于文本input。
char *getln() { char *line = NULL, *tmp = NULL; size_t size = 0, index = 0; int ch = EOF; while (ch) { ch = getc(stdin); /* Check if we need to stop. */ if (ch == EOF || ch == '\n') ch = 0; /* Check if we need to expand. */ if (size <= index) { size += CHUNK; tmp = realloc(line, size); if (!tmp) { free(line); line = NULL; break; } line = tmp; } /* Actually store the thing. */ line[index++] = ch; } return line; }
你可以有一个数组,从10个元素开始。 按字符读取input字符。 如果结束,再重新分配另外5个。 不是最好的,但是稍后你可以释放其他空间。
如果你应该留意内存,每次都读char字符并重新分配。 性能将会消失,但是你会放弃这10个字节。
另一个好的折衷是读取一个函数(使用一个局部variables)然后复制。 所以这个大的缓冲区将是函数的作用域。
您也可以使用正则expression式,例如下面的一段代码:
char *names scanf("%m[^\n]", &names)
将从stdin中获得整个行,dynamic分配它占用的空间量。 之后,当然,你必须免费的names
。
以下是创builddynamicstring的代码:
void main() { char *str, c; int i = 0, j = 1; str = (char*)malloc(sizeof(char)); printf("Enter String : "); while (c != '\n') { // read the input from keyboard standard input c = getc(stdin); // re-allocate (resize) memory for character read to be stored str = (char*)realloc(str, j * sizeof(char)); // store read character by making pointer point to c str[i] = c; i++; j++; } str[i] = '\0'; // at the end append null character to mark end of string printf("\nThe entered string is : %s", str); free(str); // important step the pointer declared must be made free }
char* load_string() { char* string = (char*) malloc(sizeof(char)); *string = '\0'; int key; int sizer = 2; char sup[2] = {'\0'}; while( (key = getc(stdin)) != '\n') { string = realloc(string,sizer * sizeof(char)); sup[0] = (char) key; strcat(string,sup); sizer++ } return string; } int main() { char* str; str = load_string(); return 0; }
这是更简单的方法
char *in_str; in_str=(char *)malloc(512000 * sizeof(char)); enter code herescanf("\n%[^\n]",in_str);