我想从一个没有固定长度的char数组中获取用户的字符串。长度应等于用户输入的字符串的长度。我尝试了 malloc(),但这也需要指定大小。请帮忙。 请标记它,我想使用char数组,而不是字符串类型。
答案 0 :(得分:0)
C字符串不包含它们的长度。每个C字符串都是一个普通的字符数组,在最后一个字符后面用null表示它的结束。因此,C IO库中的标准函数通常会接收一个字符数组并将数据写入其中。该阵列必须足够大,以容纳用户键入的所有内容。大多数函数甚至不会检查缓冲区溢出。
现在你可以做的是首先询问用户要键入的字符串的最大长度并分配精确的内存,或者你可以声明一个巨大的数组并将其大小定义为最大字符串长度。
char bigBuffer[2048];
fgets(bigBuffer, 2048, stdin);
fgets()允许您指定要占用的最大字符数。如果用户键入的字符数超过2048个,在此示例中,fgets()将返回错误,防止你的程序崩溃。
答案 1 :(得分:0)
无法分配无限长度的内存。每个内存都以一种或另一种方式绑定。
有两种方法可以处理您的情况 1.分配大容量内存,不会超出任何可能的用户输入 2. [更好的选项]使用合理大小的内存并使用长度检查功能,如fgets,以获得用户输入。
答案 2 :(得分:0)
您需要的是基本的无限输入功能。我们的想法是为输入分配一个合理大小的缓冲区,一次开始读取一个char
,如果超过缓冲区大小realloc
,则增加其大小。
你可以通过读取字符串剩余空间的长度来优化这一点,但这会变得复杂和繁琐。主要不值得。
我把这个代码写在了我的头顶,所以它可能不会按原样编译和工作,但它应该给你基本的想法。
char *buffer = malloc(100);
size_t bufferLen = 100;
size_t currLen = 0;
int c;
while ((c = getchar()) != EOF && c != '\n')
{
if (currLen > bufferLen-1) // -1 because must leave room for null terminator
{
bufferLen += 100;
buffer = realloc(buffer, bufferLen);
buffer[currLen++] = c;
}
else
buffer[currLen++] = c;
}
buffer[currLen] = '\0';
答案 3 :(得分:-1)
这可以间接方式完成。
从输入中一次读取一个字符。使用malloc/realloc
以增加的方式分配内存。它不是恒定的订单时间和恒定的订单记忆算法,但可以实现您的功能。
这是代码片段。
char ch;
int count=0;
char *charArray=NULL;
printf("Enter string\n");
while((ch=getchar())!='\n')//This condition can be changed according to needs
{
count=count+1;
charArray=(char *)realloc(charArray,count);
charArray[count-1]=ch;
}
答案 4 :(得分:-2)
您在用户输入字符串后创建数组。无法记住确切的C语法,但有些内容符合
的要求string word = "";
scanf("%s", word");
char myArray[word.length];