我有一个程序,将名称作为输入,如果输入少于允许的大小,它将保存在Pointer中。

如果输入大于允许的大小,则realloc函数将用于满足所需的内存。
此时程序仅分配6个字节,5个用于名称MICHI,1个用于'\ 0'。
如果用户键入MICHAEL,则程序将为该指针分配足够的内存,以将MICHAEL装入该指针。

这是程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct person{
    char *name;
}pers;

void addMem(void){
    unsigned int length = 6;
    size_t newLength = 0;
    unsigned int newSize = 0;
    unsigned int i =0;
    char *name;
    int c;

    name = malloc(lenght);
    if(name == NULL){
        exit(1);
    }
    newSize = length;

    printf("Enter your name:>  ");

    while ((c = getchar()) != '\n' && c!=EOF){
        name[i++]=(char)c;

        if(i == newSize){
            newSize = i+length;
            name = realloc(name, newSize);
        }
    }

    name[i] = '\0';

    newLength = strlen(name)+1;
    pers.name = malloc(newLength);

    memcpy(pers.name, name, newLength);

    free(name);
    name = NULL;
}

int main(void){
    addMem();

    printf("Your name is:>  %s\n",pers.name);
    free(pers.name);
    pers.name = NULL;
    return 0;
}


该程序运行良好,但是我需要以某种方式使realloc()仅提供最大的内存大小,因为这时它将重新分配,直到用户按下ENTER键为止。

这意味着我对Michi有6个字节(对于'\ 0'为5 + 1),最大大小应为8(对于Michael为7,对于'\ 0'为1)。

我怎样才能做到这一点?

编辑:

我希望你现在明白了。

我的程序仅接受5个字母的名称。
在某个时候,我决定may程序应该接受最多10个字母的名称。
我已经为5(michi)分配了内存。
如果键入Michael,我们有7个字母,因此程序应为Michael分配另外两个字母。
但是,如果我键入Schwarzernegger,那么这个名称太长了,我不接受它,因此我需要使我的程序仅为michael分配内存。

最佳答案

可以使用Enzo作为7个字母后停止的答案。

while ((c = getchar()) != '\n' && c != EOF) {
name[i++] = (char) c;

if (i >= length) {
    if(i+1<=7)
       name = realloc(name, i + 1);
    else
       {
          //generate error message
       }
}
}

关于c - 如何使用realloc重新分配另一个大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32638443/

10-11 19:07
查看更多