如何分配初始内存,并增加每个用户输入的内存,以获得已知该列数的字符串数组。 例如:`char * type [20]; 我想为它分配初始内存并为每个scanf增加空间("%s",type [i]);这是在循环中。 你能帮帮我吗
答案 0 :(得分:1)
您可以为此
使用动态内存分配char *read_string(void)
{
int c;
int i = 0;
char *s = malloc(1);
printf("Enter a string: \t"); // It can be of any length
/* Read characters until found an EOF or newline character. */
while((c = getchar()) != '\n' && c != EOF)
{
s[i++] = c;
s = realloc(s, i+1); // Add memory space for another character to be read.
}
s[i] = '\0'; // Nul terminate the string
return s;
}
int main(void)
{
char* type[20];
for( size_t i = 0; i < sizeof(type); i++)
type[i] = read_string();
// Do some other stuff
}
完成后不要忘记释放记忆。
答案 1 :(得分:0)
数组是一个连续的内存块,当您声明某个类型的数组时,您不能再增加或减少其大小。
一种方法是让你声明一个合理的大型char数组来保存你的&#34;字符串&#34;。像这样:
const int size=256;
char input[size]; //declares an array of 256 chars
输入实际&#34;字符串&#34;在char的图片中,你可以使用scanf,但我建议你使用fgets因为它更安全。
while(fgets(input, size, stdin)!=NULL)
{
//do something with input
}
这种方法容易受到缓冲区溢出的影响,并不一定安全,但仍然是常见的方法
至于你的&#34;字符串数组&#34;问题,你想动态分配一切。 (如果你动态分配一个char **并使它指向堆栈分配的char []你要求很长时间的麻烦)
你应该使用char **的默认大小(比如接受1000个char *),并为每个char *使用默认的分配大小,例如256 * sizeof(char)bytes。
这样,每次耗尽空间时都可以使用realloc。
答案 2 :(得分:0)
每次必须读取新字符串时,您都可以使用标头realloc
中声明的标准函数<stdlib.h>
。
这里的一个演示程序,而不是阅读字符串只复制固定数量的
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main( void )
{
char ( *s )[20] = NULL;
char ( *p )[20] = NULL;
size_t n = 0;
do
{
p = realloc( s, ( n + 1 ) * sizeof( *s ) );
if ( p )
{
s = p;
strcpy( s[n], ( char[] ){ 'A' + n, '\0'} );
++n;
}
} while ( p && n < 10 );
for ( size_t i = 0; i < n; i++ ) puts( s[i] );
free( s );
}
程序输出
A
B
C
D
E
F
G
H
I
J
注意函数realloc
的使用方式。
如果您知道字符串的数量不能少于某个常量,那么您最初可以动态分配一个大小等于此常量的数组。
例如
#define MIN_SIZE 10
//...
char ( *s )[20] = malloc( MIN_SIZE * sizeof( *s ) );