我被分配了使用函数接收和存储字符串的任务,但是,我受到了一些限制。
不允许创建大缓冲区,因此恒定大小的缓冲区意味着如果输入为1个字符,则会浪费内存
int read_string()
{
char* input;
int counter = 0;
while (( input = getchar()) != '\n') //read until detect '\n'
{
printf("%c\n",input);
counter = counter + 1;
}
printf("Length of string: %d\n", counter);
}
我目前不知道如何逐个字符地存储字符以及如何动态调整“数组”的大小,例如C ++中等效的向量。根据我的研究,C没有向量。
基于我的代码,当我输入"Hello"
时,
输出将是
h
e
l
l
o
但我不知道如何将每个字符存储在动态数组中
答案 0 :(得分:1)
如果要随着读取的每个新字符动态增加大小,则必须使用realloc函数。
使用realloc
时,即使将存储块移动到新位置,存储块的内容也会保留到新旧大小中的较小者。如果函数未能分配请求的内存块,则返回空指针。
对于我阅读的每个字符,我都会增加buffsize
,但我确实分配了buffsize + 1
。为什么?因为我需要NULL终止符一个额外的位置。
在这种情况下,字母的最后一个空位将为buffsize - 1
,而最后一个空位将在while循环的末尾分配。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
size_t buffsize = 0;
char *buffer = NULL;
char *temp;
char input;
while ((input = getchar()) != '\n') {
printf("%c\n", input);
/* Incraese the size & realloc */
++buffsize;
temp = realloc(buffer, (buffsize + 1) * sizeof(char));
if (!temp) {
printf("Error reallocating buffer!\n");
exit(1);
}
/* Setting the new read char */
buffer = temp;
buffer[buffsize - 1] = input;
}
if (buffsize) {
buffer[buffsize] = '\0';
printf("Result = [%s]\n", buffer);
} else {
printf("Empty input!\n");
}
printf("String size=%lu\n", buffsize);
/* Clean */
free(buffer);
return 0;
}
答案 1 :(得分:1)
更通用的功能-向字符串添加字符的函数。最初,指针应为NULL,并且会自动将其考虑在内
char *addchar(char **str, int c)
{
size_t len= 0;
char *tmp;
if(*str)
{
len = strlen(*str);
}
tmp = realloc(*str, len + 2);
if(tmp)
{
*str = tmp;
tmp[len] = c;
tmp[len + 1] = 0;
}
return tmp;
}
和用法-与您的有所不同
int main()
{
char *mystring = NULL;
int input;
while (( input = getchar()) != EOF)
{
if(input == '\n' || input == '\r') continue;
if(!addchar(&mystring, input))
{
printf("\nMemory allocation error\n");
}
else
{
printf("String length %zu\n", strlen(mystring));
}
}
}
答案 2 :(得分:1)
首先,函数getchar()
返回,int
不是char *
,因此您不应将其返回值分配给代码中声明为{{1 }}
您应该首先声明一个input
变量;可以称为char* input;
;并使用int
的值对其进行初始化。接下来,您应该调用函数len
并将其馈入0
以分配malloc()
内存字节来容纳单个字符,然后将其返回值分配给指针1
,例如以下:
1
然后,您应该在分配的内存中存储NUL终止字符'\ 0':
input
然后创建一个int len = 0;
input = malloc(1);
变量,因为input[0] = '\0';
的返回值为int
。这个可以称为getchar()
的变量将存储用户输入。
然后,增加分配的存储空间以容纳新字符:
int
整个代码应如下所示:
ch