[英]Reading an array of strings in C
我想读一个数组中的一组字符串。 使用malloc
或alloc
在运行时决定数组的大小,即接受字符串数作为输入。 我尝试了以下代码,但它没有用。
char *array;
array=(char*)malloc(sizeof(char)*t); //t is the size of array
for(int temp=0;temp<t;temp++)
{
gets(a[temp]);
}
在整数数组的情况下也是如此。
请帮我找到解决方案。
C没有任何自动内置支持来存储字符串,没有变量是“字符串”,并且可以自动增长以保持适当数量的字符。 你需要自己分配内存。
你现在正在做的是为正确数量的字符指针分配位置,但不为任何字符分配。 所以gets()
调用写入未分配的内存,这是未定义的行为。 由于整数完全适合每个单独的分配,这就是为什么类似的代码适用于整数。 字符串更复杂,因此您需要做更多的工作。
如果这些字符串的长度有任何已知上限,则可以使用固定长度的临时缓冲区,然后在知道所需大小后将其从该文件复制到新分配的动态内存中。 如果没有这样的绑定,你需要重复相同的概念,通过读取固定块,存储它,如果没有找到行尾,读取另一个块,使用realloc()
增加该字符串的内存分配,追加新的字符,并重复直到该行结束。
作为旁注,您应该始终避免使用gets()
,因为它不支持保护程序免受缓冲区溢出。 使用在同一页面上记录的fgets()会好得多。
你分配的是一个字符串的空间,以零终止格式存储。
如果要存储多个字符串的数组,则需要malloc()
一个char *
PLUS数组的字符串。
此外, gets()
是不安全的,因为没有大小限制。 相反,使用fgets()
。 它有以下签名:
char *fgets(char *restrict s, int n, FILE *restrict stream);
因为它想要一个流,你应该给stdin
。
所以阅读一行的最佳方法是
char * read_one_line(uint32_t maxbufsize)
{
char * s = malloc(maxbufsize);
if (!fgets(s, maxbufsize, stdin)) {
free(s);
return NULL;
} else {
char * s2 = realloc(s, strlen(s)+1); // +1 for the NUL at the end
if (s2) {
return s2;
} else {
return s; // should never happen as the memory block is shrinked
}
}
}
此函数分配一行所需的内存,在读取后适当调整大小,并将其留给调用者,以便在适当的时候再次释放它。
您需要首先为字符串数组( char*
)分配空间:
char **array;
array = (char**)malloc(sizeof(char*)*t);
然后你需要为它们中的每一个分配空间(让50
为这些字符串的最大字符数):
int i = 0, m = 50;
for (i = 0; i < t; ++i)
array[i] = (char*)malloc(sizeof(char)*51); // 51 = 50 characters + '\0'
然后你可以做你想做的事:
for(i = 0; i < t; ++i)
scanf("%50s", array[i]);
而不是gets
,最好使用指定宽度的 scanf
( %50s
= 50个字符+ '\\0'
)。
请记住,在字符数组中最后应该有一个NUL
字符。
所以用alloc
或malloc
分配t+1
字节的内存。
字符的t
个字节和终止NUL
字符的1个字节。
在你的for
循环之后,即在循环之外,只需写入
a[temp] = '\0';
然后你可以把它带入工作。
我希望它能奏效。
它看起来像这样
char *a = malloc(sizeof((char)*(t+1)));//t is number if characters
int temp;
for(temp=0; temp<t; temp++) {
gets(a[temp]);
}
a[temp] = 0;
然后打印数组,你会得到一个字符串。
printf("%s",a);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.