如何根据用户输入的长度动态分配char变量的数组大小?

问题描述 投票:0回答:1

我需要让用户输入他的名字并将其存储在数组char中,并且该数组的大小是根据他输入的用户名动态定位的。

这是我的代码:

#include <stdio.h>
void main()
{
    static int size = 5 ;
    printf("please Enter Your First Name..\n");

    char* p = (char*)malloc(size*sizeof(char));

    for(int i = 0 ; i <= sizeof(p) ; i++)
    {
        if(sizeof(p)+1 == size )
        {
            p = (char*)realloc(p,2*size*sizeof(char));
            size = sizeof(p);
        }
        else
        {
            scanf("%c",&p[i]);
        }

    }
    for(int i = 0 ; i <=size ; i++)
    {
        printf("%s",*(p+i));
    }

free(p);

}

我给数组的第一个大小为5 char,然后,如果用户名长度大于该大小,则它在堆中的重新分配大小为该大小的两倍,

并且我将条件if(sizeof(p)+1 == size )设为sizeof(p) = 4,所以我需要5 = 5,所以我将sizeof(p)+1放了进去。

但是我的代码无法正常工作。为什么?

c arrays pointers heap
1个回答
0
投票

一个常见的错误是使用sizeof(pointer)获取其指向的内存大小。这是一些示例代码供您尝试。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>             // required header files

#define CHUNK 1  // 8           // amount to allocate each time

int main(void)                  // correct definition
{
    size_t size = CHUNK;        // prefer a larger size than 1
    size_t index = 0;
    int ch;                     // use the right type for getchar()
    char *buffer = malloc(size);
    if(buffer == NULL) {
        // handle erorr
        exit(1);
    }

    printf("Please enter your first name\n");
    while((ch = getchar()) != EOF && ch != '\n') {
        if(index + 2 > size) {       // leave room for NUL
            size += CHUNK;
            char *temp = realloc(buffer, size);
            if(temp == NULL) {
                // handle erorr
                exit(1);
            }
            buffer = temp;
        }
        buffer[index] = ch;
        index++;
    }

    buffer[index] = 0;               // terminate the string
    printf("Your name is '%s'\n", buffer);
    printf("string length is %zu\n", strlen(buffer));
    printf("buffer size   is %zu\n", size);

    free(buffer);
    return 0;
}

计划会议:

Please enter your first name
Weather
Your name is 'Weather'
string length is 7
buffer size   is 8

我更喜欢使用较大的缓冲区大小,因为这对系统的压力较小,并且因为分配的内存无论如何都可能使用最小大小。当我设置

#define CHUNK 8

会话是

Please enter your first name
Wilhelmina
Your name is 'Wilhelmina'
string length is 10
buffer size   is 16
© www.soinside.com 2019 - 2024. All rights reserved.