用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);
答案 0 :(得分:1)
首先,您具有令人误解的变量名称kstring
。使用其他类似kstring_init
的方法,并为其分配一个值。我假设您要使用某种内容初始化类型name
的{{1}}变量,然后更改其长度。所以这就是全部。然后定义一个kstring
类型的常量,并用它初始化kstring的长度和数据。然后使用char *
用输入值a而不是realloc
的大小扩展指针的内存。那没有意义。由于k
的大小是指针的大小,因此是恒定的。
在您的函数中:如果您通过k
,请不要使用int
。在执行相同操作时,请使用相同的数据类型。
在从size_t
到0
的循环中,您输出相同的字符串lnth
次,这没有意义。您可能要输出字符串的字符。因此,请使用lnth+1
并在字符数组中使用索引,不要将%c
设置为上限,而将<= lnth
设置为上限。请注意数据类型是否带有符号和无符号!
设计提示:如果有一个if块,它将包装所有代码...反转条件,然后退出,以便代码位于if块之后。
使用< lnth
和size_t
时要小心,因为int
已签名而int
未签名,这会在if语句中产生问题。
请勿使用size_t
,而应使用abort
。您不希望您的程序异常中止并发生核心转储。
该程序的有效版本为:
exit