如何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);