char s1[m] = "1";
std::cin.getline(s1, n);
char s2[w] = "2";
std::cin.getline(s2, k);
假设 键盘输入字符数为 d
若s1和s2 是连续内存区域,(即s2地址在前,s1地址在后的连续内存区域)
① 当 w < d < k时,s2 的输入 可能导致 s1的内存区域中的值被修改;
② 当 d < w 时,s2 的输入没有问题,不会修改s1内存中的值;
③ 当 d > k 时,s2 的输入 可能导致 s1的内存区域中的值被修改,甚至s1内存之后的内存区域中的值都可能被修改;
但是,最多只会修改 k-1个字符,并且,之后cin的状态变为无效。
④ 当 m < d < n时,s1 的输入 可能导致 s1的内存区域之后的内存中的值被修改;
⑤ 当 d < m 时,s1 的输入没有问题,不会修改s1的内存区域之后的内存中的值;
⑥ 当 d > n 时,s1 的输入 可能导致 s1内存之后的内存区域中的值被修改;
但是,最多只会修改 n-1个字符,并且,之后cin的状态变为无效。
总结:
std::cin.getline(s, n) 危险之处
1. 若键盘输入字符数超过n,最多读取n-1个字符,并且,之后cin状态变为无效;
2. 若n值 大于 字符数组的大小,有可能篡改其他内存中的值。(很危险!!!!)