#include<stdio.h> #include<string.h> int main() { char string[100]; printf("Enter string: "); fgets(string, 100, stdin); return 0; }
或者我们也可以这样做:
char **string; string = (char **)malloc(100 * sizeof(char*));
kq4fsx7k1#
数组在C语言中有固定大小和动态大小之一,不能两者都有。当接受用户输入时,使用固定大小的数组是非常明智的,因为接受“无限输入”没有任何意义。如果有大量数据要存储,那么一旦输入得到验证,就可以将其从固定大小的数组复制到动态数组中。动态分配数组的唯一明智的方法 * 是 * 使用malloc(函数族)。它是作为char* arr = malloc(100);完成的,不需要强制转换字符的大小。“我不想”不是一个很好的理由,这是语言的工作原理。至于char **string; string = (char *)malloc(100 * sizeof(char));,它是完全错误的,没有任何意义。如果你想声明一个指针数组,它是char** arr = malloc(n * sizeof(char*))。这只为指针分配空间,而不是它们所指向的数据。或者你可以使用可变长度数组(VLA),比如int n=100; char array[n];,但是除了临时存储小对象之外,这不是推荐的做法。VLA经常在堆栈上分配,并且它们的存储时间被限制在声明它的块中。因此,过度使用它们可能会耗尽所有堆栈空间,并且一旦你离开声明它的作用域,它们也会失效。对于初学者,我建议使用malloc而不是VLA。
malloc
char* arr = malloc(100);
char **string; string = (char *)malloc(100 * sizeof(char));
char** arr = malloc(n * sizeof(char*))
int n=100; char array[n];
nkoocmlb2#
回复:如何创建一个动态字符串?"我想动态地创建一个字符串,但是我没有;t像这样使用它:字符串=(字符 *)malloc(100 * 字符大小);帮我洗洗,但别弄湿我?如果没有内存分配函数,就没有其他方法来 * 生成动态字符串 *。语言是工具,如果你发现C语言中的动态分配很复杂,尝试另一种语言(一种能为你做这件事并且有内置字符串类型的语言)。如果这是不可行的,那么你坚持与良好的旧'malloc()和realloc()。但是正如@Lundin所说,永远允许输入是不明智的(POSIX的getline()有一个漏洞),您应该指定一个上限,如果输入超过这个上限,就认为是DOS攻击,并拒绝为攻击者提供服务。
malloc()
realloc()
getline()
nhhxz33t3#
C中的内存分配是相当低级的,容易出错,所以定义更容易正确使用的函数是一个好主意。fgets 的问题是它也读取尾随的换行符,并且它不消耗整行。因此,我通常定义我自己的 ReadLine 函数。下面是静态和动态字符数组的一些方便的声明和示例用法。如果您将声明放在单独的头文件和实现文件中,则可以在所有应用程序中使用它们(像我一样)。
#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN(arr) (sizeof (arr) / sizeof (arr)[0]) #define NEW_ARRAY(ptr, n) \ (ptr) = malloc((n) * sizeof (ptr)[0]); \ if ((ptr) == NULL) { \ fprintf(stderr, "Memory allocation failed: %s\n", strerror(errno)); \ exit(EXIT_FAILURE); \ } void ReadLine(char result[], int resultLen) { int ch, i; i = 0; ch = getchar(); while ((ch != '\n') && (ch != EOF)) { if (i < resultLen - 1) { result[i] = ch; i++; } ch = getchar(); } result[i] = '\0'; } int main(void) { char string[100]; char *anotherString; int anotherStringLen; printf("Enter string: "); ReadLine(string, LEN(string)); printf("You entered '%s'\n", string); anotherStringLen = 200; NEW_ARRAY(anotherString, anotherStringLen); printf("Enter another string: "); ReadLine(anotherString, anotherStringLen); printf("You entered '%s'\n", anotherString); free(anotherString); return 0; }
3条答案
按热度按时间kq4fsx7k1#
数组在C语言中有固定大小和动态大小之一,不能两者都有。当接受用户输入时,使用固定大小的数组是非常明智的,因为接受“无限输入”没有任何意义。
如果有大量数据要存储,那么一旦输入得到验证,就可以将其从固定大小的数组复制到动态数组中。
动态分配数组的唯一明智的方法 * 是 * 使用
malloc
(函数族)。它是作为char* arr = malloc(100);
完成的,不需要强制转换字符的大小。“我不想”不是一个很好的理由,这是语言的工作原理。至于
char **string; string = (char *)malloc(100 * sizeof(char));
,它是完全错误的,没有任何意义。如果你想声明一个指针数组,它是char** arr = malloc(n * sizeof(char*))
。这只为指针分配空间,而不是它们所指向的数据。或者你可以使用可变长度数组(VLA),比如
int n=100; char array[n];
,但是除了临时存储小对象之外,这不是推荐的做法。VLA经常在堆栈上分配,并且它们的存储时间被限制在声明它的块中。因此,过度使用它们可能会耗尽所有堆栈空间,并且一旦你离开声明它的作用域,它们也会失效。对于初学者,我建议使用
malloc
而不是VLA。nkoocmlb2#
回复:如何创建一个动态字符串?"我想动态地创建一个字符串,但是我没有;t像这样使用它:字符串=(字符 *)malloc(100 * 字符大小);
帮我洗洗,但别弄湿我?
如果没有内存分配函数,就没有其他方法来 * 生成动态字符串 *。
语言是工具,如果你发现C语言中的动态分配很复杂,尝试另一种语言(一种能为你做这件事并且有内置字符串类型的语言)。
如果这是不可行的,那么你坚持与良好的旧'
malloc()
和realloc()
。但是正如@Lundin所说,永远允许输入是不明智的(POSIX的
getline()
有一个漏洞),您应该指定一个上限,如果输入超过这个上限,就认为是DOS攻击,并拒绝为攻击者提供服务。nhhxz33t3#
C中的内存分配是相当低级的,容易出错,所以定义更容易正确使用的函数是一个好主意。fgets 的问题是它也读取尾随的换行符,并且它不消耗整行。因此,我通常定义我自己的 ReadLine 函数。下面是静态和动态字符数组的一些方便的声明和示例用法。如果您将声明放在单独的头文件和实现文件中,则可以在所有应用程序中使用它们(像我一样)。