scanf(“%s”,&str)的注意点:

如果你希望从字符串数组的某一位置处开始写入字符串,那么需要取该位置的地址,后面的元素都将被输入数据和结尾的’/0’覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <string.h>
int main() {
char map[12][12];
for (int i=0;i<=11;i++) map[i][0]='*',map[i][11]='*';//实际上map[i][11]处会被后面scanf时的‘/0’覆盖,
for (int i=0;i<=11;i++) map[0][i]='*',map[11][i]='*';//尝试修改边界判断方式,而不要覆盖'\0'
char *F;
char *C;
int keyf = 1, keyc = 1;
for (int i=1; i<11; i++) {
scanf("%s",&map[i][1]);
if (keyf) F = strchr(map[i], 'F');
if (keyc) C = strchr(map[i], 'C');
if (F) {
*F = '.';
keyf = 0;
}
if (C) {
*C = '.';
keyc = 0;
}
}
int time = 0, derF = 8, derC = 8;
while (F != C) {
time++;
switch (derF) {
case 8:
if (*(F-12) != '*') F -= 12;
else derF = 6;
break;
case 6:
if (*(F+1) == '*' || *(F+1) == '\0') derF = 2;
else F += 1;
break;
case 2:
if (*(F+12) != '*') F += 12;
else derF = 4;
break;
case 4:
if (*(F-1) != '*') F -= 1;
else derF = 8;
break;
}
switch (derC) {
case 8:
if (*(C-12) != '*') C -= 12;
else derC = 6;
break;
case 6:
if (*(C+1) == '*'|| *(C+1) == '\0') derC = 2;
else C += 1;
break;
case 2:
if (*(C+12) != '*') C += 12;
else derC = 4;
break;
case 4:
if (*(C-1) != '*') C -= 1;
else derC = 8;
break;
}
if (time > 10000) {
time = 0;
break;
}
}
printf("%d",time);
return 0;
}