动态地在C中创建数组,一次输入1个字符

时间:2019-01-27 14:10:03

标签: c memory-management

我被分配了使用函数接收和存储字符串的任务,但是,我受到了一些限制。

  • 仅能使用getchar()逐字符接收用户输入
  • 不假设输入长度(例如,不允许创建大小为100的数组)
  • 不允许两次读取输入内容,例如,使用第一轮输入来计算字符串大小,然后在创建第一轮计算出的字符串大小数组之后要求用户再次输入。
  • 不允许创建大缓冲区,因此恒定大小的缓冲区意味着如果输入为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

但我不知道如何将每个字符存储在动态数组中

3 个答案:

答案 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