关于vs中对于scanf_s修改发现的问题,尤其是使用scanf_s读取字符时发现的问题。
首先,对于scanf_s读取字符时的格式,这里要明确说一点,scanf_s不是scanf其使用格式是不相同的,读取字符时的使用格式为:scanf_s("%c",变量地址,读取字符长度上限);,也就是说当我们按照scanf的方法使用scanf_s时可能会出现读取参数不足的问题。
其次就是经过使用发现,当我们同时使用多个scanf_s时会发现其会跳过多个scanf_s,这是因为在每一个scanf_s后都会产生一个莫名其妙的回车(个人感觉好废的东西,还会有不必要的麻烦),这时我们只需要加入一个getchar();,用以吞掉这个没用的回车,例如下图这样:
scanf_s("%d", &T->n);
getchar();
for (i = 0; i < T->n; i++) {
fflush(stdin);
printf("请输入节点名称:");
scanf_s("%c", &T->arr[i].data, 5);
getchar();
printf("请输入节点权值:");
scanf_s("%d", &T->arr[i].weight);
getchar();
T->arr[i].parent = T->arr[i].lchild = T->arr[i].rchild = -1;
}
这样即可解决跳过键入的问题。
最后就是要每一个scanf_s都加,我人傻了,不然会吞掉你输入的字符??????不知道vs要搞什么,反正自己注意一下就行了,解决方法简单,但是挺麻烦的。