用C编写程序,我试图将两个变量传递给函数kstrextend。名称是存储在值kstring中的单词或字符集,而a是数字值,但据我所知,名称根本没有传递到函数中,我也不知道为什么。东西存储不正确吗?因为该函数正常工作,所以我无法正确输入名称。

kstring和名称的声明:

kstring name;
char kstring[50];


Typedef:

typedef struct
    {
        char *data;
        size_t length;
    } kstring;


功能:

void kstrextend(kstring *strp, size_t nbytes)
{
    char *nwData;
    int lnth=strp->length;
    if(lnth < nbytes)
    {
        // new array allocate with large size and copy data to new array
        nwData = (char *)realloc(strp->data, nbytes);
        // call abort in case of error
        if(nwData == NULL)
        {
            abort();
        }
        //Making strp->data point to the new array
        strp->data = nwData;
        //Setting strp->length to the new size.
        strp->length = nbytes;
        for(int i = 0; i <= lnth; i++)
        {
            printf("\n %s",strp->data);
        }
        // filled with '\0' in remaining space of new array
        for (int lp = lnth; lp < nbytes; lp++)
        {
            strp->data[lp] = '\0';
            printf("\n %s", strp->data[lp]);
        }
    }
}


主要部分:

    size_t a;
    char * k = kstring;
    printf("\n Enter number: ");
    scanf("%d", &a);
    name.data = (char*)calloc(sizeof(k), 1);
    strcpy(input, k);
    name.length= kstring_length;
    kstrextend(&name,a);

最佳答案

首先,您误导了变量名称kstring。使用其他类似kstring_init的方法,并为其分配一个值。我假设您要使用某种内容初始化类型为namekstring变量,然后更改其长度。所以这就是全部。然后定义一个char *类型的常量,并用它初始化kstring的长度和数据。然后使用realloc用输入值a而不是k的大小扩展指针的内存。那没有意义。因为k的大小是指针的大小,所以它是常数。

在函数中:如果传递int,请不要使用size_t。在执行相同操作时,请使用相同的数据类型。

在从0lnth的循环中,输出相同的字符串lnth+1次,这没有意义。您可能要输出字符串的字符。因此,使用%c并在字符数组中使用索引,不要将<= lnth设置为上限,而将< lnth设置为上限。如果有符号和无符号,请注意数据类型!

设计提示:如果有一个if块,它将包装所有代码...反转条件,然后退出,以便代码位于if块之后。

使用size_tint时要小心,因为int是带符号的,而size_t没有带符号,这会在if语句中产生问题。

不要使用abort,而要使用exit。您不希望您的程序异常中止和核心转储。

该程序的有效版本为:

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

typedef struct
    {
        char *data;
        size_t length;
    } kstring;

kstring name;
char *kstring_init = "blabla";

void kstrextend(kstring *strp, size_t nbytes)
{
    char *nwData;

    size_t lnth = strp->length;

    if ((int) lnth >= (int) nbytes) {
        printf("Error, size already larger than requested size.\n");
        exit(-1);
    }

    // new array allocate with large size and copy data to new array
    nwData = realloc(strp->data, sizeof(char) * (int) nbytes);
    if(nwData == NULL)
    {
        printf("Error, realloc returned NULL\n");
        exit(-1);
    }

    //Making strp->data point to the new array
    strp->data = nwData;
    //Setting strp->length to the new size.
    strp->length = nbytes;

    for(int i = 0; i < lnth; i++)
    {
        printf("\n %c", strp->data[i]);
    }
    // filled with '\0' in remaining space of new array
    for (int lp = lnth; lp < (int) nbytes; lp++)
    {
        strp->data[lp] = '\0';
        printf("\n %c", strp->data[lp]);
    }
}

int main(void)
{
    size_t a;

    printf("\n Enter number: ");
    scanf("%d", &a);

    name.length = strlen(kstring_init) + 1;
    printf("Length of string is: %d\n", name.length);
    name.data = (char*)malloc(sizeof(char) * name.length);
    strcpy(name.data, kstring_init);

    printf("Old string: %s\n", name.data);
    printf("You want to reallocate %d bytes\n", a);

    kstrextend(&name, a);

    return 0;
}

10-08 15:10