C字符串输入溢出其他字符串输入

时间:2016-11-18 03:42:20

标签: c arrays string

我正在做一个简单的控制台类型命令系统,并且输入一个命令将scanf一个整数然后将scanf一个字符串,但第二个字符串的内容溢出原始字符串

ptemp

int itemid; char *element; 是指向包含以下内容的结构的指针:

FSWatch

我尝试使用预定义大小的数组,但似乎没有任何效果......

2 个答案:

答案 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;
    }
}