我正在做一个简单的控制台类型命令系统,并且输入一个命令将scanf一个整数然后将scanf一个字符串,但第二个字符串的内容溢出原始字符串
ptemp
int itemid;
char *element;
是指向包含以下内容的结构的指针:
FSWatch
我尝试使用预定义大小的数组,但似乎没有任何效果......
答案 0 :(得分:0)
有人发表评论没有任何溢出是正确的。你缺少的是(以外行人的话说)对角色的保留。将某些内容声明为textarea
而不是char*
意味着您已准备好引用允许您使用角色操作的内存的另一部分。为了简单起见,我重写了您的代码,以便您的程序正常运行。请记住,此代码依赖于用户输入长度小于100到200个字符的字符串。如果您需要更多字符,请随意增加方括号中的数字。
我还创建了一个add_parent_node函数来验证数据处理是否有效。
如果你想得到一点偏执,并且你觉得你的系统实现scanf很棘手,那么你可以在while语句下面放置以下内容:
char[xx]
它的作用是使用空字符填充整个结构。这意味着itemid的值将为零,因为零为null,而element将为200个空字符。
以下是代码:
memset(ptemp,0,sizeof(ptemp));
答案 1 :(得分:0)
如果您不想更改while循环之外的任何内容,我认为这就是您可以做的。
while (exit == 0) {
scanf("%s", input);
if (strcmp(input, "parent") == 0) {
if(0 == ptemp ){
/* Allocate memory only once and reuse it.*/
ptemp = malloc(sizeof(node_p));
/* Allocate memory for element. */
ptemp->element = malloc(sizeof(char) * 1024 /* Max string len + 1 */)
}
printf("Id: ");
scanf("%d", &ptemp->itemid);
printf("\nElement:");
scanf("%s", ptemp->element);
add_parent_node(parent, ptemp->itemid, ptemp->element);
}
else if (strcmp(input, "exit") == 0) {
if(0 != ptemp){
/* If memory is allocated for ptemp, free it. */
if(0 != ptemp->element){
free(ptemp->element);
ptemp->element = 0;
}
free(ptemp);
ptemp = 0;
}
free(input);
input = 0;
exit = 1;
break;
}
}